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)
2-Spring-基于xml配置bean
技不如人,甘拜下风
java spring spring xml java
Spring-基于xml配置bean文章目录Spring-基于xml配置bean一.Bean实例化的4种方式1.1无参数构造方法(开发最常用)1.2静态工厂方法1.3实例工厂方法1.4FactoryBean方式(Spring底层使用较多)1.5FactoryBean与BeanFactory区别二.Bean相关知识2.1Bean的作用域2.2Bean的生命周期2.3Bean的属性注入2.3.1构造方
Operating System Concepts读书笔记——操作系统本质、类型与发展【1】
墨汁儿
操作系统
文章目录一、操作系统基础概念1.操作系统功能2.计算机系统组成部分3.用户角度对操作系统的需求4.系统角度二、各类型操作系统1.大型机系统1.1批处理系统1.2多道程序系统1.3分时系统2.桌面系统3.多处理器系统4.分布式系统4.1客户机-服务器系统4.2对等系统5.集群系统6.实时系统7.手持系统三、其它1.功能迁移2.计算环境2.1传统计算2.2基于Web的计算2.3嵌入式计算一、操作系统基
Spring Boot 2.0配置接口 WebMvcConfigurer
quick458
java spring boot
WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制。基于java-based方式的springmvc配置,需要创建一个配置类并实现WebMvcConfigurer接口。有时候我们想要自己定义一些Handler,Interceptor,ViewResolver,MessageConverter,这
JavaWeb学习笔记
时间会给答案scidag
java java-ee servlet 笔记 学习 数据库
一.刨析JDBC1.概念:JDBC就是java语言操作关系型数据库的一套API2.常用API2.1DriverManager:作用1.注册驱动2.获取数据库连接;都是静态方法,直接类名.方法2.2Connection:作用1.获取sql执行对象2.事务管理《《关于管理事务回滚常用方法setAutoCommit()commit(),rollback()2.3Statement:作用执行SQL语句《《
《Java开发者必备:jstat、jmap、jstack实战指南》 ——从零掌握JVM监控三剑客
admin_Single
java jvm 开发语言
《Java开发者必备:jstat、jmap、jstack实战指南》——从零掌握JVM监控三剑客文章目录**《Java开发者必备:jstat、jmap、jstack实战指南》**@[toc]**摘要****核心工具与场景****关键实践****诊断流程****工具选型决策表****调优原则****未来趋势****第一章:GC基础:垃圾回收机制与监控的关系****1.1内存世界的"垃圾分类"——GC分
CSS3学习教程,从入门到精通,CSS3 布局语法知识点及案例代码(15)
知识分享小能手
编程语言如门 前端开发 网页开发 css3 学习 css 前端 html5 html Java后端开发
CSS3布局知识点及案例代码一、盒模型知识点CSS盒模型是理解CSS布局的基础,它包括内容(content)、内边距(padding)、边框(border)和外边距(margin)四个部分。content:盒子的内容区域,定义宽度和高度。padding:内容与边框之间的空间,可控制内容与边框的距离。border:围绕内容和内边距的边框,可设置边框的样式、宽度和颜色。margin:边框与其他元素之间
CSS3学习教程,从入门到精通,CSS3 盒子模型语法知识点及案例代码(13)
知识分享小能手
编程语言如门 前端开发 网页开发 css3 学习 前端 css html5 html Java后端开发
CSS3盒子模型语法知识点及案例代码CSS3盒子模型概述CSS3盒子模型是用于控制网页元素布局和外观的重要工具。它包括标准盒子模型、IE盒子模型以及CSS3引入的弹性盒子模型和网格布局模型。一、标准盒子模型(StandardBoxModel)语法selector{width:value;height:value;padding:value;border:value;margin:value;}wi
CSS3学习教程,从入门到精通,CSS3 背景样式语法知识点及案例代码(11)
知识分享小能手
编程语言如门 前端开发 网页开发 css3 学习 前端 css html5 Java Java后端开发
CSS3背景样式语法知识点及案例代码一、背景颜色(background-color)/*设置元素的背景颜色*/selector{background-color:color-value;}selector:选择器,指定要设置背景颜色的元素。color-value:颜色值,可以是颜色名称、十六进制颜色代码、RGB颜色值或HSL颜色值等。案例:.box{width:200px;height:200px
springMVC WebMvcConfigurer详解
angen2018
# springMVC spring
`WebMvcConfigurer`是SpringMVC中一个非常重要的接口,它提供了多种方法来自定义SpringMVC的配置。以下是一些常用的配置方法:1.**拦截器配置(addInterceptors)**:通过实现`addInterceptors`方法,可以添加一个或多个拦截器,并对它们进行配置,如指定拦截的路径和排除的路径。这在日志记录、权限检查、性能监控等方面非常有用。2.**跨域配置(
10初识Spring MVC框架
TechLens
JAVA EE笔记 servlet spring java
学习内容一、回顾1.JSPModel2架构模型采用JSP+Servlet+JavaBean技术实现了页面显示、流程控制和业务逻辑的分离Jsp负责生成动态网页,只用做显示页面;Servlet负责流程控制,用来处理各种请求的分派;JavaBeans负责业务逻辑,对数据库的操作流程控制等通用逻辑以硬编码的方式实现,每次开发新的Web应用程序均需重新编写流程控制、通用逻辑代码2.WebMVC应用框架Spr
4.2 静态资源访问:WebMvcConfigurer接口
与海boy
spring boot
在SpringMVC中,对于静态资源都需要开发者手动配置静态资源过滤。SpringBoot中对此也提供了自动化配置,可以简化静态资源过滤配置。自定义策略如果默认的静态资源过滤策略不能满足开发需求,也可以自定义静态资源过滤策略,自定义静态资源过滤策略有以下两种方式:1.在配置文件中定义可以在application.properties中直接定义过滤规则和静态资源位置,代码如下:spring.mvc.
文档处理控件Aspose.Words 教程:.NET版中增强的 AI 文档摘要功能
CodeCraft Studio
控件 文档管理 人工智能 excel word pdf
Aspose.Words是一个功能强大的Word文档处理库。它可以帮助开发人员自动编辑、转换和处理文档。自24.11版以来,Aspose.Wordsfor.NET提供了AI驱动的文档摘要功能,使用户能够从冗长的文本中快速提取关键见解。在25.2版中,我们通过使用Anthropic生成语言模型进行摘要扩展了此功能。本篇内容将对此做讨论的。Aspose.wordsfor.Net最新版下载文档摘要有何新
BUAA-SCSE Training day2
屎宝宝
BUAA Training 2013
好多题目是uva上的然后当时看过刘汝佳的书再看看就好还有一些思路都很清晰代码也很少就没有什么可写的了A-OpenCreditSystemTimeLimit:3000MSMemoryLimit:0KB64bitIOFormat:%lld&%lluSubmitStatusPracticeUVA11078DescriptionProblemEOpenCreditSystemInput:StandardI
跨域自监督学习:打破数据壁垒的创新突破
mslion
学习 人工智能 跨模态学习 深度学习 计算机视觉 自监督表示学习
近年来,跨域学习和跨模态学习在多个应用领域中取得了显著的进展。尽管不同领域和模态之间的数据分布差异和标注数据稀缺常常带来挑战,但越来越多的研究集中在如何通过自监督学习和无监督领域适应技术来解决这些问题。自监督学习作为一种无需大量标注数据的方法,能够有效地从未标注数据中提取有用特征,并在跨域或跨模态设置中增强模型的迁移能力和泛化能力。此外,如何处理源域和目标域之间的差异,使得模型能够在多领域或跨模态
Java多线程
反方向的空
Java多线程 java 开发语言
Java多线程为什么要在代码中引入多线程?可以使用多个线程来处理任务,提高效率如果阻塞点过多,一个线程会处理不过来;例如TCP服务器在等待建立连接的时候会阻塞,而整个流程不能因为这个而卡死在这里,所以引入另外的线程去处理另外的任务哪些地方是线程安全问题的风险点?线程对共享数据修改的部分,必须考虑是否线程安全!!!并发编程的优缺点为什么要使用并发编程?(优点)充分利用多核CPU的计算能力:通过并发编
spring注入list集合
m0_74825656
面试 学习路线 阿里巴巴 spring list java
spring在帮我们管理bean的时候,会帮我们完成自动注入,其中有一个比较特殊的类型:list这篇笔记主要记录spring注入list集合的原理应用publicinterfaceRest{}@ComponentpublicclassRestServiceImpl01implementsRest{}@ComponentpublicclassRestServiceImpl02implementsRe
前端面试常见的计算机网络内容梳理
GISer_Jinger
前端 javascript
前端面试常见的计算机网络内容梳理,我得从搜索结果里找相关的信息。先看看各个网页的内容。网页1和网页2主要讲OSI模型、TCP/IP模型,ARP、DNS、TCP/UDP区别这些基础概念,这些都是常考的点。网页3提到了TCP三次握手、HTTP缓存、跨域方法,还有CDN原理,这些都是前端面试的重点。网页4详细讨论了HTTP请求方法、状态码、请求头和响应头,这些内容也很关键。网页5提到了HTTPS加密原理
图解HTTP的知识框架详解
GISer_Jinger
javascript 前端 架构
图解HTTP的知识框架详解,我需要结合提供的搜索结果来整理出一个结构化的回答。首先,看看用户提供的搜索结果,有三个文档,分别是关于《图解HTTP》的读书笔记、Java解析HTTP的方法,以及网络基础知识的图解内容。不过用户的问题主要集中在HTTP的知识框架,所以可能主要参考第一个和第三个文档。第一个搜索结果[1]是《图解HTTP》的读书笔记,里面详细介绍了HTTP协议的基本概念、请求方法、状态码、
Springboot上传图片无法回显而且浏览器页面显示404无法找到文件的路径。使用了WebMvcConfigurer接口重写了addResourceHandlers方法。
~听 风~
spring boot java spring
@ConfigurationpublicclassMyConfigurationimplementsWebMvcConfigurer{@OverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){registry.addResourceHandler("/setmealpic/**").addResourceLoca
【BUAA S4 OS】Lab2 内存管理
Roisy++
OS BUAA 笔记 linux
文章目录指导书梳理内核程序启动物理内存管理链表宏虚拟内存管理两级页表结构访问内存与TLB重填EntryHi、EntryLo0、EntryLo1TLB相关指令TLB的维护时纪exam前准备提醒参数、宏、函数缩写对照地址相互转换相关从地址中获取信息函数作用Exam翻车分析题目理解出现偏差——理解错题意&以为实现了自映射机制【疑问】页表在虚拟内存中不应该是连续的吗,这样怎么保证其连续性?【延伸】页表到底
深度讨论Python for循环
观智能
python 开发语言
作者的其他文章推荐:强化学习再受关注!for循环使用于遍历可迭代对象的Python语句,工作原理如下:#for循环foriteminiterable:print(item)#等价于iterator=iter(iterable)#获取迭代器whileTrue:try:item=next(iterator)#获取下一个元素print(item)exceptStopIteration:break#迭代结
GSMA SAS 安全生产审计检查清单
SofterICer
eSIM SAS 安全 网络
GSMASAS安全生产审计检查清单以下是根据GSMAFS.18-SecurityAccreditationScheme-ConsolidatedSecurityRequirementsandGuidelinesv11.1文档中与安全生产相关的章节,整理的安全生产审计检查清单。该清单涵盖了生产流程安全的关键领域、控制措施和最佳实践,并按照文档结构进行组织。1.生产流程控制控制措施/要求适用性状态备注
SGP.31/.32 规范以及它将如何影响物联网
SofterICer
eSIM 物联网
去年,GSMA发布了适用于物联网设备的新eSIM远程配置标准的架构和要求、SGP.31eSIM物联网架构和网络受限和/或用户界面(UI)受限物联网设备中eUICC远程配置的要求。自SGP.31获得批准以来,业界一直在等待GSMA发布SGP.31的技术实施规范SGP.32。5月26日,GSMASGP.32eSIM物联网技术规范发布,为设备制造商开始受益于新标准并扩展其物联网项目铺平了道路。据物联网专
初识Spring MVC并使用Maven搭建SpringMVC
NPU_Li Meng
Spring Spring MVC Maven Web
SpringMVC基于MVC模式(模型(Model)-视图(View)-控制器(Controller))实现,能够帮助你构建像Spring框架那样灵活和松耦合的Web应用程序。核心类与接口DispatcherServlet前置控制器HandlerMapping处理器映射Controller控制器ViewResolver视图解析器View视图处理SpringMVC的请求流向当用户在浏览器中点击链接或
操作系统笔记-番外-操作系统经典书籍推荐
VioletCherry
OS学习 操作系统
最近整理以前的笔记,有人问关于操作系统的书籍。我有个爱好喜欢收集书籍,前后也收集了几百本高质量的书籍,这里给大家推荐基本关于操作系统的书籍OperatingSystemConcepts10thedition又称恐龙书,这本书已经出到第10版,可见其经典。作者是想从理论层面把问题的产生和解决思路阐述清楚,包含了操作系统各个方面,是一本非常不错的入门书籍。豆瓣书评下载地址:https://github
YOLOv8 改进:添加 AKConv(任意采样形状和任意数目参数的卷积)
鱼弦
人工智能时代 YOLO
YOLOv8改进:添加AKConv(任意采样形状和任意数目参数的卷积)引言在目标检测领域中,YOLO(YouOnlyLookOnce)系列因其速度和效率而受到广泛关注。为了进一步优化模型性能,可以引入创新的卷积操作,例如AKConv,即“任意采样形状和任意数目参数的卷积”。这种卷积能够灵活地调整采样策略,以更好地适应输入特征。技术背景传统卷积运算在采样位置和参数数量上具有固定性,这限制了其对复杂几
【操作系统】Operating System Conceptions第二章知识整理总结
guozhirourou
Operating System Conceptions阅读 Operating System Conceptions
小结:这几天我看了《OperatingSystemConceptions》的第二章。第二章先从用户、开发者以及计算机系统的角度开始,展示操作系统所提供的服务,继而讲解了操作系统是如何通过系统调用来为系统提供服务的,阐述一段程序是如何在系统中装入链接以及执行的。同时通过比较和对比整体、分层、微核、模块化和混合策略操作系统的不同设计,向我们展示了macOS、Android、Windows三种不同的操作
Spring MVC +Spring 框架学习总结-入门必学知识点
柚子味*
Java spring spring mvc java spring mvc
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。spring相关视频教程:https://www.bilibili.com/video/BV1nz4y1d7uySpringMVC是Spr
《Operating System Concepts》阅读笔记:p272-p285
codists
读书笔记 操作系统
《OperatingSystemConcepts》学习第27天,p272-p285总结,总计14页。一、技术总结1.semaphoreAsemaphoreSisanintegervariablethat,apartfrominitialization,isaccessedonlythroughtwostandardatomicoperations:wait()andsignal().2.monit
【操作系统概念】【恐龙书】笔记六——第六章 进程同步
我岂是非人哉
计算机操作系统
Chapter6:ProcessSynchronization问题的提出:彼此合作的进程之间可以用共享逻辑地址空间的方式来实现,共享逻辑地址空间,也就是共享代码区和数据区,会导致数据不一致,所以介绍一些避免数据不一致的机制。6.1BackgroundConcurrentaccesstoshareddatamayresultindatainconsistencyMaintainingdatacons
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