schema.xml的加载过程概况
com.actiontech.dble.config.loader.xml.XMLSchemaLoader
的load()
方法是schema.xml的加载入口。这个加载入口仅仅把schema.xml,以带DTD校验的方式加载成到内存中,形成w3c的DOM。然后依次调用loadDataHosts()
、loadDataNodes()
和loadSchemas()
这三个方法,处理schema.xml中的三种一级标签,加载成com.actiontech.dble.config.model
命名空间中对应的类的对象。
方法名
处理的标签
目标类
loadDataHosts()
DataHostConfig
loadDataNodes()
DataNodeConfig
loadSchemas()
SchemaConfig
处理标签——loadDataHosts()
loadDataHosts()
的使命是将
标签加载成DataHostConfig
对象。在逻辑结构上,
标签和DataHostConfig
对象完全相同。
属性
DataHostConfig属性
name
String name
maxCon
int maxCon
minCon
int minCon
balance
int balance
switchType
int switchType
slaveThreshold
int slaveThreshold
tempReadHostAvailable
boolean tempReadHostAvailable
String heartbeatSQL
DBHostConfig[] writeHosts
Map readHosts
可以看到,相对于name这些属性,
和
这两个property(XML概念)的处理是重点,其中需要着重解决下面两个问题:
和
应该加载成什么?
除了
可以包含一个或多个
外,在属性层面,两者基本没有差异。因此统一用com.actiontech.dble.config.model.DBHostConfig
这个类来标识它们。一个DBHostConfig
对象表示一个
或
标签。
对
的一对多包含关系应该如何保存下来?
每个
标签在DataHostConfig.writeHosts
这个数组中存储,也因此会有它在数组中的序号 ,所以DataHostConfig.readHosts
这个Map集合利用了这一点,设计成了“<
在writeHosts中的序号, 这个
拥有的
数组>”这么一种形式来存储(虽然我觉得用存储密度更高的二维数组可能会更好)。
了解了以上概况之后,它的工作流程就很明晰了,大致是:
从schema.xml中逐个找出
标签
加载
的简单属性到临时变量中:name, maxCon, minCon, balance, switchType, slaveThreshold, tempReadHostAvailable和
加载
的复杂属性
和
到临时变量中
根据临时变量生成DataHostConfig
对象,并登记到XMLSchemaLoader
中(加入到内部Map集合中)
private void loadDataHosts(Element root) {
// 提取schema.xml中所有的标签
NodeList list = root.getElementsByTagName("dataHost");
// 逐个标签进行处理
for (int i = 0, n = list.getLength(); i < n; ++i) {
Element element = (Element) list.item(i);
// 加载简单属性到临时变量中:name, maxCon, minCon, balance, switchType, slaveThreshold, tempReadHostAvailable和
String name = element.getAttribute("name");
if (dataHosts.containsKey(name)) {
throw new ConfigException("dataHost name " + name + "duplicated!");
}
int maxCon = Integer.parseInt(element.getAttribute("maxCon"));
int minCon = Integer.parseInt(element.getAttribute("minCon"));
final int balance = Integer.parseInt(element.getAttribute("balance"));
String switchTypeStr = element.getAttribute("switchType");
int switchType = switchTypeStr.equals("") ? -1 : Integer.parseInt(switchTypeStr);
String slaveThresholdStr = element.getAttribute("slaveThreshold");
int slaveThreshold = slaveThresholdStr.equals("") ? -1 : Integer.parseInt(slaveThresholdStr);
String tempReadHostAvailableStr = element.getAttribute("tempReadHostAvailable");
boolean tempReadHostAvailable = !tempReadHostAvailableStr.equals("") && Integer.parseInt(tempReadHostAvailableStr) > 0;
final String heartbeatSQL = element.getElementsByTagName("heartbeat").item(0).getTextContent();
// 获取当前下所有的
NodeList writeNodes = element.getElementsByTagName("writeHost");
// 初始化当前中,和的临时变量(数组及集合)
DBHostConfig[] writeDbConfs = new DBHostConfig[writeNodes.getLength()];
Map readHostsMap = new HashMap<>(2);
// 逐个进行处理
for (int w = 0; w < writeDbConfs.length; w++) {
Element writeNode = (Element) writeNodes.item(w);
// 创建对应的DBHostConfig对象,并加入到临时变量的数组中
writeDbConfs[w] = createDBHostConf(name, writeNode, maxCon, minCon);
// 获取当前下所有的
NodeList readNodes = writeNode.getElementsByTagName("readHost");
if (readNodes.getLength() != 0) {
// 创建存放当前下所有的临时数组
DBHostConfig[] readDbConfs = new DBHostConfig[readNodes.getLength()];
// 逐个进行处理
for (int r = 0; r < readDbConfs.length; r++) {
Element readNode = (Element) readNodes.item(r);
// 创建对应的DBHostConfig对象,并加入到临时变量的数组中
readDbConfs[r] = createDBHostConf(name, readNode, maxCon, minCon);
}
// 将准备好的临时数组注册到临时变量(Map集合)中
readHostsMap.put(w, readDbConfs);
}
}
// 根据各属性的临时变量创建DataHostConfig
DataHostConfig hostConf = new DataHostConfig(name,
writeDbConfs, readHostsMap, switchType, slaveThreshold, tempReadHostAvailable);
hostConf.setMaxCon(maxCon);
hostConf.setMinCon(minCon);
hostConf.setBalance(balance);
hostConf.setHearbeatSQL(heartbeatSQL);
// 将当前对应的DataHostConfig注册到XMLSchemaLoader的内部清单中
dataHosts.put(hostConf.getName(), hostConf);
}
}
当中,createDBHostConf()
这个函数在DBLE和MyCat中,基本功能是一致的:
获取
或
的属性:host、url、user、password、usingDecrypt和weight
检查host、url和user都不为空
从host属性中分离出ip和port
对password属性的内容进行RSA的解密(usingDecrypt属性为1时)
但是,由于设计思路的分歧,DBLE裁剪了MyCat中的以下功能:
非MySQL数据库的支持(通过
的dbType属性提供)
其他JDBC Driver的支持(通过
的dbDriver属性提供)
无用属性filters和logTime
private DBHostConfig createDBHostConf(String dataHost, Element node, int maxCon, int minCon) {
// 加载必须属性host、url和user
String nodeHost = node.getAttribute("host");
String nodeUrl = node.getAttribute("url");
String user = node.getAttribute("user");
String ip = null;
int port = 0;
// 检查必须属性是否都不为空
if (empty(nodeHost) || empty(nodeUrl) || empty(user)) {
throw new ConfigException(
"dataHost " + dataHost +
" define error,some attributes of this element is empty: " +
nodeHost);
}
// 从host属性中分离出ip和port
int colonIndex = nodeUrl.indexOf(':');
ip = nodeUrl.substring(0, colonIndex).trim();
port = Integer.parseInt(nodeUrl.substring(colonIndex + 1).trim());
// 加载password和usingDecrypt属性
String password = node.getAttribute("password");
String usingDecrypt = node.getAttribute("usingDecrypt");
// 对password属性的内容进行RSA的解密
String passwordEncryty = DecryptUtil.dbHostDecrypt(usingDecrypt, nodeHost, user, password);
// 创建目标DBHostConfig对象并根据各个属性赋值
DBHostConfig conf = new DBHostConfig(nodeHost, ip, port, nodeUrl, user, passwordEncryty);
conf.setMaxCon(maxCon);
conf.setMinCon(minCon);
// 读取weight属性并对DBHostConfig.weight赋值
String weightStr = node.getAttribute("weight");
int weight = "".equals(weightStr) ? PhysicalDBPool.WEIGHT : Integer.parseInt(weightStr);
conf.setWeight(weight);
// 返回准备好的DBHostConfig对象
return conf;
}
处理标签——loadDataNodes()
与loadDataHosts()
相似,loadDataNodes()
的使命是将
标签加载成与之逻辑结构相同的Java对象。在这里,加载目标就是DataNodeConfig
对象。
属性
DataNodeConfig属性
name
String name
database
String database
dataHost
String dataHost
可以看出,相对于
和DataHostConfig
,
和DataNodeConfig
要简单得多。但是,MyCat和DBLE为了让
支持一种自制语法,loadDataNodes()
的代码变得复杂了许多。
从现有代码来看,这个语法是为了减少schema.xml的编写量(并不会减少DataNodeConfig
对象的个数),将多个拥有同样dataHost属性或database属性 的
缩写成一个
。
private void loadDataNodes(Element root) {
// 提取schema.xml中所有的标签
NodeList list = root.getElementsByTagName("dataNode");
// 逐个标签进行处理
for (int i = 0, n = list.getLength(); i < n; i++) {
Element element = (Element) list.item(i);
// 加载所有属性到临时变量中:name, dataHost和database
String dnNamePre = element.getAttribute("name");
String databaseStr = element.getAttribute("database");
if (lowerCaseNames) {
databaseStr = databaseStr.toLowerCase();
}
String host = element.getAttribute("dataHost");
if (empty(dnNamePre) || empty(databaseStr) || empty(host)) {
throw new ConfigException("dataNode " + dnNamePre + " define error ,attribute can't be empty");
}
// 根据用户属性中的输入,判断用户是否使用了缩写语法
String[] dnNames = SplitUtil.split(dnNamePre, ',', '$', '-');
String[] databases = SplitUtil.split(databaseStr, ',', '$', '-');
String[] hostStrings = SplitUtil.split(host, ',', '$', '-');
if (dnNames.length > 1 && dnNames.length != databases.length * hostStrings.length) {
throw new ConfigException("dataNode " + dnNamePre +
" define error ,dnNames.length must be=databases.length*hostStrings.length");
}
if (dnNames.length > 1) {
// 如果用户使用了缩写语法,
// 就使用“外层dataHost,内层database”的两层循环去生生成多个DataNodeConfig,
// 并注册到XMLSchemaLoader的内部清单中
List mhdList = mergerHostDatabase(hostStrings, databases);
for (int k = 0; k < dnNames.length; k++) {
String[] hd = mhdList.get(k);
String dnName = dnNames[k];
String databaseName = hd[1];
String hostName = hd[0];
createDataNode(dnName, databaseName, hostName);
}
} else {
// 如果用户没有使用缩写语法,
// 就直接生成一个DataNodeConfig,并注册到XMLSchemaLoader的内部清单中
createDataNode(dnNamePre, databaseStr, host);
}
}
}
loadDataNodes()
里用到了两个辅助方法,在这里简单说明一下:
mergerHostDatabase()
是在确定用户使用了缩写语法之后,求两个字符串属性dataHost × database(dataHost与database的叉乘)
private List mergerHostDatabase(String[] hostStrings, String[] databases) {
List mhdList = new ArrayList<>();
for (String hostString : hostStrings) {
for (String database : databases) {
String[] hd = new String[2];
hd[0] = hostString;
hd[1] = database;
mhdList.add(hd);
}
}
return mhdList;
}
createDataNode()
除了创建一个DataNodeConfig
对象外,还必须说明它会自动把这个新对象注册到XMLSchemaLoader
的内部清单里
private void createDataNode(String dnName, String database, String host) {
// 创建新的DataNodeConfig对象
DataNodeConfig conf = new DataNodeConfig(dnName, database, host);
// 注册到XMLSchemaLoader之前的检查1:名称不能与已有的重复
if (dataNodes.containsKey(conf.getName())) {
throw new ConfigException("dataNode " + conf.getName() + " duplicated!");
}
// 注册到XMLSchemaLoader之前的检查2:dataHost属性指定的DataHost必须已注册
if (!dataHosts.containsKey(host)) {
throw new ConfigException("dataNode " + dnName + " reference dataHost:" + host + " not exists!");
}
// 将新的DataNodeConfig对象注册到XMLSchemaLoader的内部清单中
dataNodes.put(conf.getName(), conf);
}
处理标签——loadSchemas()
loadSchemas()
的使命是将
标签加载成SchemaConfig
对象。在逻辑结构上,
标签和SchemaConfig
对象有很多共同的地方。
属性
SchemaConfig属性
name
String name
dataNode
String dataNode
sqlMaxLimit
int defaultMaxLimit
此外,
标签的子标签由于涉及到了E-R关系这种比较特殊的分片策略,导致这个子标签的处理要分成三部分:
直接加载一般属性,例如name、primaryKey之类。
读取用户指定的分片算法(rule属性)和逻辑分片(dataNode属性)的字面值 ,进行是否存在之类的检查后,与之前的rule.xml和loadDataNodes()
的成果关联起来。
如果含有
子标签,那这个和它的
构成了E-R关系,会使用processChildTables()
方法来递处理可能存在的多层
,并为每个
创建一个比较赋值特殊的TableConfig
对象——它会被赋予parentTC、joinKey和parentKey属性。
tips:loadTables()
执行完后,返回来的是每个和
都有自己的TableConfig
对象的一个Map哈希表。如果存在E-R关系的表,还需要回到loadSchemas
,由它调用XMLSchemaLoader
类的其他方法来处理、整合E-R关系引入而产生的关系处理。SchemaConfig
使用独立的数据结构ERTable
来描述E-R关系。
private void loadSchemas(Element root) {
// 读取所有的标签
NodeList list = root.getElementsByTagName("schema");
// 逐个标签进行处理
for (int i = 0, n = list.getLength(); i < n; i++) {
Element schemaElement = (Element) list.item(i);
// 加载所有属性到临时变量中:name、dataNode和sqlMaxLimit
String name = schemaElement.getAttribute("name");
if (lowerCaseNames) {
name = name.toLowerCase();
}
String dataNode = schemaElement.getAttribute("dataNode");
String sqlMaxLimitStr = schemaElement.getAttribute("sqlMaxLimit");
// 处理sqlMaxLimit属性:如果用户有配置sqlMaxLimit的话,就使用用户的配置值;如果没有,则设置为-1
int sqlMaxLimit = -1;
if (sqlMaxLimitStr != null && !sqlMaxLimitStr.isEmpty()) {
sqlMaxLimit = Integer.parseInt(sqlMaxLimitStr);
}
// 读取dataNode属性,并直接加入到一个List
if (dataNode != null && !dataNode.isEmpty()) {
List dataNodeLst = new ArrayList<>(1);
dataNodeLst.add(dataNode);
// 调用checkDataNodeExists()来检查用户给这个指定的dataNode是不是都已经已经加载过的
checkDataNodeExists(dataNodeLst);
} else {
dataNode = null;
}
// 调用loadTables()方法来加载当前里的所有标签,每个标签加载成一个TableConfig对象,放到Map中
Map tables = loadTables(schemaElement, lowerCaseNames);
if (schemas.containsKey(name)) {
throw new ConfigException("schema " + name + " duplicated!");
}
// if schema has no default dataNode,it must contains at least one table
if (dataNode == null && tables.size() == 0) {
throw new ConfigException(
"schema " + name + " didn't config tables,so you must set dataNode property!");
}
// 生成SchemaConfig对象(tips:当中会涉及buildERMap()方法的调用,用于创建依据父表的分布来分布子表,不关注这种用法,跳过)
SchemaConfig schemaConfig = new SchemaConfig(name, dataNode,
tables, sqlMaxLimit);
// 用mergeFuncNodeERMap()和mergeFkERMap()对新生成的SchemaConfig对象进行优化,(tips:用于ER表,不关注这种用法,跳过)
mergeFuncNodeERMap(schemaConfig);
mergeFkERMap(schemaConfig);
// 将优化后的`SchemaConfig`注册到`XMLSchemaLoader`中
schemas.put(name, schemaConfig);
}
// 处理完所有``标签后,调用`makeAllErRelations()`(tips:用于ER表,不关注这种用法,跳过)
makeAllErRelations();
}
loadTables()
会将标签加载成TableConfig
对象。由于当中涉及众多E-R表的处理逻辑,而笔者并不关注,所以先暂时略过,只分析其处理普通的过程:
创建TableConfig
对象
读取简单属性name、primaryKey、autoIncrement、needAddLimit、type、rule和ruleRequired
读取属性dataNode,这个属性可以一次指定多个dataNode,使用“,”、“$”或“-”来分隔
调用checkDataNodeExists()来检查用户给这个指定的dataNode是不是都已经已经加载过的
如果当前处理的有分片函数(非全局表),通过checkRuleSuitTable()来间接调用所有分片算法的基类AbstractPartitionAlgorithm的suitableFor(),检查用户配置的dataNode属性里dataNode个数是否与这个表配置的算法的分片数量一致(tips:这个检查依赖AbstractPartitionAlgorithm.getPartitionNum()提供当前算法需要的分片数量,默认上该函数返回的-1会让suitableFor()跳过检查,所以如果要实现自己的定制分片函数的话,需要自行覆盖该类;suitableFor()函数是final,无法被覆盖)
如果用户在配置的dataNodes时使用了distribute语法(distribute(xxx,xxx,xxx))的话,调用distributeDataNodes()方法进行排序,保证dataNode编号过程中,尽可能地跨位于不同的物理分片(dataHost)上——首先,一个dataHost创建一个桶(数据结构是列表),把用户的dataNode过一遍,按照它们的dataHost放进对应的桶里;然后,按顺序从每个桶里取出一个dataNode,放到最终的返回值里,直到所有桶都取空——这样排序后,返回值里相邻的两个dataNode必然位于不同的dataHost上(tips:dataHost和dataNode的最终顺序仅与用户的输入顺序有关)
将初始化完成的TableConfig
对象加入Map
你可能感兴趣的:(DBLE 2.17.08.1与MyCat 1.6.5的启动过程(5)——加载配置文件schema.xml)
Bongo-Cat-Crew:用Python打造动态音乐猫
元楼
本文还有配套的精品资源,点击获取简介:在这个项目中,我们创建了一个将音乐、游戏和编程结合的创新体验,允许玩家通过动态猫声分类与节奏游戏OSU!互动。Python的使用使得音乐节奏识别、猫声分类逻辑和游戏接口交互成为可能。项目的核心包含了音乐节奏分析、游戏模式识别和猫声动画实现等技术要点,旨在为玩家提供独特的交互乐趣。1.Python在项目中的应用和角色1.1Python在IT行业中的普及Pytho
集成学习中的多样性密码:量化学习器的多样性
元楼
集成学习 学习 机器学习 人工智能
合集-scikit-learn(69)1.【scikit-learn基础】--概述2023-12-022.【scikit-learn基础】--『数据加载』之玩具数据集2023-12-043.【scikit-learn基础】--『数据加载』之真实数据集2023-12-064.【scikit-learn基础】--『数据加载』之样本生成器2023-12-085.【scikit-learn基础】--『数据
iOS 12.2 真机测试实战指南:全面掌握16E226测试要点
Ready-Player
本文还有配套的精品资源,点击获取简介:在iOS开发中,真机测试对于确保应用在不同设备上的性能和兼容性至关重要。本文深入解析了iOS12.2版本和特定的构建号16E226,包括新功能和改进点。重点介绍了开发者在进行真机测试时应关注的方面,如兼容性、性能、新特性集成、UI适配、错误和崩溃的修复、权限请求处理、网络连接稳定性及安全性。通过本文,开发者能够学习如何使用真机测试包16E226来优化应用,确保
MSP430F247TPMR
szrileyH
TI 低功耗低频振荡器 内部频率高达16MHz 32KHz晶振
描述德州仪器(TI)MSP430系列超低功耗微控制器包含几个器件,这些器件特有针对多种应用的不同外设集。这种架构与5种低功耗模式相组合,专为在便携式测量应用中延长电池使用寿命而优化。该器件具有一个强大的16位RISCCPU,16位寄存器和有助于获得最大编码效率的常数发生器。数控振荡器(DCO)可在不到1μs的时间里从低功耗模式唤醒至运行模式。MSP430F23x/24x(1)/2410系列微控制器
TPAMI 2024 | 利用相机原始快照进行高效的视觉计算
小白学视觉
论文解读 IEEE TPAMI 数码相机 TPAMI 深度学习 顶刊论文 论文解读
题目:EfficientVisualComputingWithCameraRAWSnapshots利用相机原始快照进行高效的视觉计算作者:ZhihaoLi;MingLu;XuZhang;XinFeng;M.SalmanAsif;ZhanMa源码链接:https://njuvision.github.io/rho-vision摘要传统相机在传感器上捕获图像辐照度(RAW),并使用图像信号处理器(IS
微信小程序开发全解析:流程、交互、框架对比与避坑实战
北辰alk
微信小程序 微信小程序 交互 小程序
文章目录一、微信小程序开发全景认知1.1技术架构解析1.2开发模式选择二、原生开发全流程详解2.1环境搭建2.2项目结构规范2.3核心API实战三、主流框架开发实践3.1Taro(React技术栈)3.1.1项目初始化3.1.2跨平台编译3.2Uni-app(Vue技术栈)3.2.1条件编译示例四、原生开发vs框架开发深度对比4.1开发效率对比4.2性能对比(数据实测)4.3跨平台能力4.4调试复
基于python的api扫描器系统的设计与实现
博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌温馨提示:文末有CSDN平台官方提供的老师Wechat/QQ名片:)Java精品实战案例《700套》2025最新毕业设计选题推荐:最热的500个选题o( ̄▽ ̄)d介绍在当今数字化社会,网络安全问题日益突出,为了有效识别和防范网络威胁,开发一款全面的Web应用渗透测试系统至关重要。本研究基于Py
考了微软MOS认证后才发现的事
qb_jiajia
microsoft 微软
一、微软MOS认证和计算机二级的区别二、微软MOS认证简介微软MOS认证,MicrosoftOfficeSpecialist(MOS)中文称之为“微软办公软件国际认证”,是微软为全球所认可的Office软件国际性专业认证,全球有168个国家地区认可,每年有近百万人次参加考试,它能有效证明Word、Excel、PPT、Acess等办公软件技能。三、微软MOS认证含金量有效证明精通Ofice办公软件,
AGI面临突破需要清除这两朵乌云:解码智能鸿沟的终极密码
1.物理学史的镜鉴:科学革命的预兆1900年英国物理学家开尔文勋爵宣称"物理学大厦已告完成",却未料及那两朵"光速悖论"与"紫外灾难"的乌云,最终催生了相对论与量子力学。这段历史在AI领域重现:当算力呈指数级增长,模型参数突破万亿级,我们依然无法教会AI"水杯会掉落"的常识。这种历史重演揭示着深刻规律——任何科学体系的突破往往始于对既有范式的质疑。正如爱因斯坦推翻绝对时空观,当前AI研究需要重新审
语义分割模型的轻量化与准确率提升研究
pk_xz123456
仿真模型 深度学习 算法 transformer 深度学习 人工智能 算法 数据结构
语义分割模型的轻量化与准确率提升研究1.引言语义分割是计算机视觉领域的核心任务之一,它要求模型为图像中的每个像素分配一个类别标签。随着深度学习的发展,语义分割模型在多个领域得到了广泛应用,如自动驾驶、医学影像分析、遥感图像解译等。然而,现有的语义分割模型往往面临两个主要挑战:模型复杂度高导致难以部署在资源受限的设备上,以及准确率仍有提升空间以满足实际应用需求。本文将从模型轻量化和准确率提升两个角度
基于小样本的高光谱图像分类任务:CMFSL方法及Python实现
pk_xz123456
仿真模型 算法 深度学习 分类 python 人工智能 深度学习 机器学习
基于小样本的高光谱图像分类任务:CMFSL方法及Python实现1.引言高光谱图像分类是遥感图像处理领域的重要研究方向,它在农业监测、环境评估、军事侦察等领域有着广泛的应用。与传统RGB图像不同,高光谱图像包含数百个连续的光谱波段,能够提供丰富的光谱信息。然而,高光谱图像分类面临着维度灾难、样本获取困难等挑战,特别是在小样本条件下,传统分类方法往往表现不佳。针对这一问题,本文介绍一种基于小样本的高
ubuntu创建、删除虚拟环境
screenCui
ubuntu linux
your_name是自己起的环境名字创建虚拟环境首先通过xshell等工具与服务器建立链接。然后进行以下两步:激活condasource~/.bashrc2.创建虚拟环境condacreate-nyour_namepython=3.7退出以及删除虚拟环境退出虚拟环境condadeactivate删除虚拟环境condaremove-nyour_name--all
python画图修改字体为新罗马字体
#设置字体为新罗马字体font={'family':'serif','serif':['TimesNewRoman'],'size':20,'style':'normal'}plt.rc('font',**font)plt.rc('axes',labelsize=20)如果跑出来不是新罗马字体,那是服务器没装新罗马字体的问题,切换环境到本地就可以了。(本地一般都有新罗马字体)
如何将联系人从 iPhone 转移到 realme?
Techlifehacks
ios iphone ios
当您从iPhone换到Realme手机时,最重要的一步就是顺利地转移您的联系人。联系人是我们日常沟通的重要组成部分,丢失联系人会给我们带来极大的不便。幸运的是,现在有多种方法可以帮助您轻松地将联系人从iPhone转移到RealmeAndroid设备,而无需担心兼容性问题。本文将介绍几种实用方法,帮助您快速完成联系人迁移。第1部分。如何使用克隆手机将联系人从iPhone传输到realme(官方方式)
成像系统中的噪声:光子散粒噪声
YoungHong1992
计算机视觉 图像信号处理
关键要点研究表明,传感器成像系统中的噪声主要来源于光子散粒噪声,这是光量子特性的结果。噪声形式为随机波动,遵循泊松分布,在图像中表现为颗粒感,尤其在低光条件下明显。证据显示,不同光照环境下的噪声表现不同,亮光条件下信号噪声比更高,相对噪声较小。噪声的产生在仅考虑光学成像、不考虑电流因素的情况下,传感器成像系统中的主要噪声来源是光子散粒噪声。这是由光的量子性质引起的,即光子到达传感器时数量的统计随机
python序列化任意结构到dict
YoungHong1992
python 开发语言
defserialize(obj:Any)->Any:"""因为Param没有序列化的接口,无法直接转为dict或json,因此编写该函数,把Param转为dict"""ifisinstance(obj,np.ndarray):returnobj.tolist()#将numpy.ndarray转换为列表elifisinstance(obj,(int,float,str,bool)):#基本数据类型
微软智能语音平台赋能理想汽车:创新驱动,引领智能出行新体验
在新能源汽车与智能网联技术蓬勃发展的今天,汽车行业的创新已不再局限于动力系统与车身设计,智能化、人性化的交互体验正成为新的竞争焦点。作为中国造车新势力的佼佼者,理想汽车凭借其首款量产车型理想ONE,不仅在市场上取得了辉煌成绩,更通过与微软工业级智能语音平台的深度合作,重新定义了车载语音交互的标准,为全球汽车行业树立了智能化转型的典范。理想ONE:以家庭为核心,打造智能出行新标杆理想ONE作为理想汽
AI 的出现,是否能替代 IT 从业者?
敲代码的苦13
人工智能
在科技浪潮奔涌向前的时代,AI正以惊人的速度渗透进各个领域,IT行业首当其冲。当AI编写代码的效率不断提升,当智能算法能够快速完成系统故障诊断,当自动化工具可以处理大量数据运维工作,IT从业者们不禁心生疑虑:AI真的会成为“职业终结者”,将自己从岗位上彻底替代吗?这场关于AI与IT从业者未来的讨论,充满了争议与悬念,也关乎着无数人的职业命运。一、AI在IT领域的应用现状编程开发中的AIAI在编程开
如何将应用程序从 iPhone 传输到Mac电脑
Coolmuster
苹果手机 iPhone iOS iphone macos ios
我们的设备常常需要同步以保持数据的一致性。对于iPhone用户来说,将应用程序和数据同步到Mac电脑上可以带来极大的便利,无论是为了备份、跨设备使用还是数据迁移。一、为什么需要将iPhone应用程序同步到Mac?在多种情况下,用户可能需要将iPhone上的应用程序同步到Mac上,例如:跨设备工作流程,需要在Mac上继续使用iPhone应用程序。备份应用程序及其数据,以防丢失。将iPhone上购买的
如何将 iPhone 同步到Mac?
Coolmuster
iPhone iOS 苹果手机 iphone macos ios
想要将iPhone同步到Mac吗?Mac和iPhone是功能强大的Apple设备,允许用户存储文件。但只有当它们结合在一起时,你才能体验到苹果生态系统凝聚力的力量。你可以通过多种方式将iPhone连接到Mac,以实现无缝文件共享。阅读本指南,了解如何将iPhone与Mac同步并无缝共享文件。第1部分.如何通过专业工具将iPhone同步到Mac将iPhone同步到Mac最佳方法是使用专业软件Cool
如何将联系人从 iPhone 导入到Mac ?
如果您希望将联系人从iPhone无缝迁移到Mac,那么您应该选择经过验证的解决方案来确保过程顺利。将联系人从iPhone传输到Mac不仅需要一根USB数据线。面对现实,联系人信息极其宝贵,因此在转移过程中需要格外小心。如果您想掌握正确将联系人从iPhone导入到Mac的方法,请留意以下详细的实用信息。方法1:不使用iCloud/iTunes将iPhone中的联系人导入到Mac并非所有人都倾向于使用
Spring MVC 框架解析
我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、Spri
Spring MVC深度解析
我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、Spri
Spring Cloud服务治理精讲
Java廖志伟
Java场景面试宝典 Spring Cloud Service Governance Distributed Systems
我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、Spri
领域设计关键技术解析
Java廖志伟
Java场景面试宝典
我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、Spri
AIGC领域AI作画:在数字雕塑中的应用实践
AI原生应用开发
AI 原生应用开发 AIGC AI作画 ai
AIGC领域AI作画:在数字雕塑中的应用实践关键词:AIGC、AI作画、数字雕塑、生成对抗网络、3D建模、艺术创作、深度学习摘要:本文深入探讨了AIGC(人工智能生成内容)技术在数字雕塑领域的创新应用。我们将从技术原理、算法实现到实际案例,全面解析AI如何赋能传统数字雕塑创作流程。文章首先介绍AIGC在艺术创作中的背景和发展现状,然后详细讲解核心算法原理和数学模型,接着通过实际项目案例展示AI作画
WebView 页面在多语言环境中错位怎么办?国际化适配调试全过程
2501_91600747
http udp https websocket 网络安全 网络协议 tcp/ip
移动应用全球化后,WebView页面往往需要同时适配多种语言和地区设置,包括英语、中文、阿拉伯语等。尤其是当用户使用RTL(Right-to-Left,阿拉伯语、希伯来语等)语言环境时,页面容易出现布局错乱、文字溢出或控件位置异常。这类问题并不会在本地开发环境或英文/中文设置下暴露,常常等到国际用户反馈后才暴露。本文分享一次我们为多语言环境适配进行调试和修复的完整过程。背景:国际化上线后阿拉伯语用
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(五)
个人主页:艾莉丝努力练剑❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题学习方向:C/C++方向⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平前言:我们在学习过程中会碰到很多很多问题,本系列文章不会博主不会额外再创建一个新的专栏来收录,因为这一系列文章创作的初心主要是针对回顾知识点(遵循遗忘曲线并且根据自身的实际情况可以做出一些
Python爬虫实战:使用Scrapy和Selenium高效爬取USPTO美国专利数据
Python爬虫项目
2025年爬虫实战项目 python 爬虫 scrapy 开发语言 selenium 测试工具
引言在当今的知识经济时代,专利数据蕴含着巨大的商业和技术价值。美国专利商标局(USPTO)作为全球最大的专利数据库之一,收录了数百万项专利信息,这些数据对于企业竞争分析、技术趋势预测和学术研究都具有重要意义。本文将详细介绍如何使用Python构建一个高效、稳定的USPTO专利数据爬虫系统。一、USPTO专利数据库概述1.1USPTO数据库结构USPTO提供了多种访问专利数据的途径:专利全文和图像数
Python爬虫实战:爬取百度学术摘要信息全流程详解与代码示例
Python爬虫项目
2025年爬虫实战项目 python 爬虫 开发语言 scrapy 学习 dubbo 百度
1.前言随着学术资源数字化的普及,百度学术成为学者们常用的论文搜索平台。获取大量论文摘要信息对于文献综述、知识图谱构建等研究极为重要。本文将系统讲解如何利用Python编写爬虫,批量抓取百度学术上的论文摘要。我们将结合最新Python爬虫技术,涵盖基础同步爬虫、异步爬虫、多线程,全面实战演示。2.项目背景与目标百度学术支持通过关键词搜索论文,展示论文标题、作者、期刊、摘要等信息。目标是:根据关键词
java责任链模式
3213213333332132
java 责任链模式 村民告县长
责任链模式,通常就是一个请求从最低级开始往上层层的请求,当在某一层满足条件时,请求将被处理,当请求到最高层仍未满足时,则请求不会被处理。
就是一个请求在这个链条的责任范围内,会被相应的处理,如果超出链条的责任范围外,请求不会被相应的处理。
下面代码模拟这样的效果:
创建一个政府抽象类,方便所有的具体政府部门继承它。
package 责任链模式;
/**
*
linux、mysql、nginx、tomcat 性能参数优化
ronin47
一、linux 系统内核参数
/etc/sysctl.conf文件常用参数 net.core.netdev_max_backlog = 32768 #允许送到队列的数据包的最大数目
net.core.rmem_max = 8388608 #SOCKET读缓存区大小
net.core.wmem_max = 8388608 #SOCKET写缓存区大
php命令行界面
dcj3sjt126com
PHP cli
常用选项
php -v
php -i PHP安装的有关信息
php -h 访问帮助文件
php -m 列出编译到当前PHP安装的所有模块
执行一段代码
php -r 'echo "hello, world!";'
php -r 'echo "Hello, World!\n";'
php -r '$ts = filemtime("
Filter&Session
171815164
session
Filter
HttpServletRequest requ = (HttpServletRequest) req;
HttpSession session = requ.getSession();
if (session.getAttribute("admin") == null) {
PrintWriter out = res.ge
连接池与Spring,Hibernate结合
g21121
Hibernate
前几篇关于Java连接池的介绍都是基于Java应用的,而我们常用的场景是与Spring和ORM框架结合,下面就利用实例学习一下这方面的配置。
1.下载相关内容: &nb
[简单]mybatis判断数字类型
53873039oycg
mybatis
昨天同事反馈mybatis保存不了int类型的属性,一直报错,错误信息如下:
Caused by: java.lang.NumberFormatException: For input string: "null"
at sun.mis
项目启动时或者启动后ava.lang.OutOfMemoryError: PermGen space
程序员是怎么炼成的
eclipse jvm tomcat catalina.sh eclipse.ini
在启动比较大的项目时,因为存在大量的jsp页面,所以在编译的时候会生成很多的.class文件,.class文件是都会被加载到jvm的方法区中,如果要加载的class文件很多,就会出现方法区溢出异常 java.lang.OutOfMemoryError: PermGen space.
解决办法是点击eclipse里的tomcat,在
我的crm小结
aijuans
crm
各种原因吧,crm今天才完了。主要是接触了几个新技术:
Struts2、poi、ibatis这几个都是以前的项目中用过的。
Jsf、tapestry是这次新接触的,都是界面层的框架,用起来也不难。思路和struts不太一样,传说比较简单方便。不过个人感觉还是struts用着顺手啊,当然springmvc也很顺手,不知道是因为习惯还是什么。jsf和tapestry应用的时候需要知道他们的标签、主
spring里配置使用hibernate的二级缓存几步
antonyup_2006
java spring Hibernate xml cache
.在spring的配置文件中 applicationContent.xml,hibernate部分加入
xml 代码
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hi
JAVA基础面试题
百合不是茶
抽象实现接口 String类 接口继承 抽象类继承实体类 自定义异常
/* * 栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、 *int、long、 float、double、boolean)和对象的引用,数据可以共享,速度仅次于 * 寄存器(register),快于堆。堆(heap):用于存储对象。 */ &
让sqlmap文件 "继承" 起来
bijian1013
java ibatis sqlmap
多个项目中使用ibatis , 和数据库表对应的 sqlmap文件(增删改查等基本语句),dao, pojo 都是由工具自动生成的, 现在将这些自动生成的文件放在一个单独的工程中,其它项目工程中通过jar包来引用 ,并通过"继承"为基础的sqlmap文件,dao,pojo 添加新的方法来满足项
精通Oracle10编程SQL(13)开发触发器
bijian1013
oracle 数据库 plsql
/*
*开发触发器
*/
--得到日期是周几
select to_char(sysdate+4,'DY','nls_date_language=AMERICAN') from dual;
select to_char(sysdate,'DY','nls_date_language=AMERICAN') from dual;
--建立BEFORE语句触发器
CREATE O
【EhCache三】EhCache查询
bit1129
ehcache
本文介绍EhCache查询缓存中数据,EhCache提供了类似Hibernate的查询API,可以按照给定的条件进行查询。
要对EhCache进行查询,需要在ehcache.xml中设定要查询的属性
数据准备
@Before
public void setUp() {
//加载EhCache配置文件
Inpu
CXF框架入门实例
白糖_
spring Web 框架 webservice servlet
CXF是apache旗下的开源框架,由Celtix + XFire这两门经典的框架合成,是一套非常流行的web service框架。
它提供了JAX-WS的全面支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用,同时它能与spring进行完美结合。
在apache cxf官网提供
angular.equals
boyitech
AngularJS AngularJS API AnguarJS 中文API angular.equals
angular.equals
描述:
比较两个值或者两个对象是不是 相等。还支持值的类型,正则表达式和数组的比较。 两个值或对象被认为是 相等的前提条件是以下的情况至少能满足一项:
两个值或者对象能通过=== (恒等) 的比较
两个值或者对象是同样类型,并且他们的属性都能通过angular
java-腾讯暑期实习生-输入一个数组A[1,2,...n],求输入B,使得数组B中的第i个数字B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]
bylijinnan
java
这道题的具体思路请参看 何海涛的微博:http://weibo.com/zhedahht
import java.math.BigInteger;
import java.util.Arrays;
public class CreateBFromATencent {
/**
* 题目:输入一个数组A[1,2,...n],求输入B,使得数组B中的第i个数字B[i]=A
FastDFS 的安装和配置 修订版
Chen.H
linux fastDFS 分布式文件系统
FastDFS Home:http://code.google.com/p/fastdfs/
1. 安装
http://code.google.com/p/fastdfs/wiki/Setup http://hi.baidu.com/leolance/blog/item/3c273327978ae55f93580703.html
安装libevent (对libevent的版本要求为1.4.
[强人工智能]拓扑扫描与自适应构造器
comsci
人工智能
当我们面对一个有限拓扑网络的时候,在对已知的拓扑结构进行分析之后,发现在连通点之后,还存在若干个子网络,且这些网络的结构是未知的,数据库中并未存在这些网络的拓扑结构数据....这个时候,我们该怎么办呢?
那么,现在我们必须设计新的模块和代码包来处理上面的问题
oracle merge into的用法
daizj
oracle sql merget into
Oracle中merge into的使用
http://blog.csdn.net/yuzhic/article/details/1896878
http://blog.csdn.net/macle2010/article/details/5980965
该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSE
不适合使用Hadoop的场景
datamachine
hadoop
转自:http://dev.yesky.com/296/35381296.shtml。
Hadoop通常被认定是能够帮助你解决所有问题的唯一方案。 当人们提到“大数据”或是“数据分析”等相关问题的时候,会听到脱口而出的回答:Hadoop! 实际上Hadoop被设计和建造出来,是用来解决一系列特定问题的。对某些问题来说,Hadoop至多算是一个不好的选择,对另一些问题来说,选择Ha
YII findAll的用法
dcj3sjt126com
yii
看文档比较糊涂,其实挺简单的:
$predictions=Prediction::model()->findAll("uid=:uid",array(":uid"=>10));
第一个参数是选择条件:”uid=10″。其中:uid是一个占位符,在后面的array(“:uid”=>10)对齐进行了赋值;
更完善的查询需要
vim 常用 NERDTree 快捷键
dcj3sjt126com
vim
下面给大家整理了一些vim NERDTree的常用快捷键了,这里几乎包括了所有的快捷键了,希望文章对各位会带来帮助。
切换工作台和目录
ctrl + w + h 光标 focus 左侧树形目录ctrl + w + l 光标 focus 右侧文件显示窗口ctrl + w + w 光标自动在左右侧窗口切换ctrl + w + r 移动当前窗口的布局位置
o 在已有窗口中打开文件、目录或书签,并跳
Java把目录下的文件打印出来
蕃薯耀
列出目录下的文件 文件夹下面的文件 目录下的文件
Java把目录下的文件打印出来
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2015年7月11日 11:02:
linux远程桌面----VNCServer与rdesktop
hanqunfeng
Desktop
windows远程桌面到linux,需要在linux上安装vncserver,并开启vnc服务,同时需要在windows下使用vnc-viewer访问Linux。vncserver同时支持linux远程桌面到linux。
linux远程桌面到windows,需要在linux上安装rdesktop,同时开启windows的远程桌面访问。
下面分别介绍,以windo
guava中的join和split功能
jackyrong
java
guava库中,包含了很好的join和split的功能,例子如下:
1) 将LIST转换为使用字符串连接的字符串
List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
Web开发技术十年发展历程
lampcy
android Web 浏览器 html5
回顾web开发技术这十年发展历程:
Ajax
03年的时候我上六年级,那时候网吧刚在小县城的角落萌生。传奇,大话西游第一代网游一时风靡。我抱着试一试的心态给了网吧老板两块钱想申请个号玩玩,然后接下来的一个小时我一直在,注,册,账,号。
彼时网吧用的512k的带宽,注册的时候,填了一堆信息,提交,页面跳转,嘣,”您填写的信息有误,请重填”。然后跳转回注册页面,以此循环。我现在时常想,如果当时a
架构师之mima-----------------mina的非NIO控制IOBuffer(说得比较好)
nannan408
buffer
1.前言。
如题。
2.代码。
IoService
IoService是一个接口,有两种实现:IoAcceptor和IoConnector;其中IoAcceptor是针对Server端的实现,IoConnector是针对Client端的实现;IoService的职责包括:
1、监听器管理
2、IoHandler
3、IoSession
ORA-00054:resource busy and acquire with NOWAIT specified
Everyday都不同
oracle session Lock
[Oracle]
今天对一个数据量很大的表进行操作时,出现如题所示的异常。此时表明数据库的事务处于“忙”的状态,而且被lock了,所以必须先关闭占用的session。
step1,查看被lock的session:
select t2.username, t2.sid, t2.serial#, t2.logon_time
from v$locked_obj
javascript学习笔记
tntxia
JavaScript
javascript里面有6种基本类型的值:number、string、boolean、object、function和undefined。number:就是数字值,包括整数、小数、NaN、正负无穷。string:字符串类型、单双引号引起来的内容。boolean:true、false object:表示所有的javascript对象,不用多说function:我们熟悉的方法,也就是
Java enum的用法详解
xieke90
enum 枚举
Java中枚举实现的分析:
示例:
public static enum SEVERITY{
INFO,WARN,ERROR
}
enum很像特殊的class,实际上enum声明定义的类型就是一个类。 而这些类都是类库中Enum类的子类 (java.l