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)
Maven <parent> 标签的作用及使用详解
CodeDunkster
maven java
在使用Maven进行项目构建时,标签是一个非常重要的配置元素。它允许子模块继承父模块的配置,从而实现一致性和配置管理的简化。本文将详细介绍标签的主要作用,并通过示例来说明其使用方式和关键点。标签的主要作用标签的作用主要体现在以下几个方面:继承父模块的配置依赖管理(dependencyManagement):子模块可以继承父模块中定义的依赖管理配置。在子模块的dependencies中引用依赖时,如
FBI 数据泄露!黑客组织公布全部数据
H_kiwi
安全威胁分析 安全 接口隔离原则 网络安全 大数据
作者:HikkI-Chan日期:2024年8月28日近日,著名的BreachForums社区内,一名黑客发布了一个名为“OpPriserv1.0”的文件包。此文件包据称包含美国联邦调查局(FBI)及其他政府机构的敏感信息,黑客组织声称这些数据是通过“OperationPriser”行动所获取的。行动概述根据发布者HikkI-Chan的描述,“OperationPriser”是一次对美国政府网络的深
使用MyBatis插入数据并返回自动生成的ID
CodeDunkster
mybatis 数据库
在使用MyBatis进行数据库操作时,经常会遇到需要插入数据并返回自动生成的主键ID的情况。为了解决这个问题,我们可以使用MyBatis提供的useGeneratedKeys和keyProperty属性。本文将介绍这两个属性的作用以及如何使用它们来实现插入数据并返回自动生成的ID。1.useGeneratedKeys属性作用:用于告诉MyBatis是否使用数据库自动增长的主键。当设置为true时,
Microsoft 将在 CrowdStrike 服务中断后举办 Windows 安全峰会
H_kiwi
microsoft 安全 网络安全 安全威胁分析 开发语言 网络 php
随着网络安全威胁不断升级,全球范围内的企业和组织正面临前所未有的安全挑战。近期,知名网络安全公司CrowdStrike的服务中断事件引发了广泛关注。据悉,该事件导致了一系列严重后果,包括航班取消、医院运作延误,以及财富500强公司约54亿美元的经济损失。为了应对此次事件并防止类似事件的再次发生,微软宣布将于9月10日举办“Windows端点安全生态系统峰会”。此次峰会将联合CrowdStrike等
ctt效能学习体会
周源虹
周末两天的Ctt自我效能突破课程很快结束了,满满的收获与感动。感谢顾老师设计了这么好的课程,让我们有机会结伴做一群高效能的践行者。集体照,看我们笑的多开心我跟良芳老师是DISC学习班的同学,她是我的天使,我们在课程结束的时候她跟我讲到自我效能的课程,可以把增加工作、生活效率,重要的是能够将年度计划落实到每天执行,这就厉害了,一下子成功的引起的我的好奇心。良芳老师让我感触比较深刻的有以下几点:1.表
平和式教养——Day32
Elina_baby
今天我要读的是平和的父母教导而非控制。今天的内容有点儿长,所以我分3部分完成。首先用教导代替控制是什么意思呢?父母像教练一样交汇和支持孩子发展他最好的自我。教练也不会一味惩罚他会耐心地给予孩子创造成长的机会,庆祝孩子正确走出的每一步,孩子会更加努力和更像教练的行为回应教练,而另一方面,控制的是通过惩罚迫使孩子听你的话。这说明平和的父母不会惩罚孩子,当然他们设定限制,但不包括惩罚。我知道很多人都觉得
2022-01-09
Alice_f0cc
凌晨四点醒来万籁俱寂,静静地读你的话语,误你的心意你的爱情那么美好,如甘霖滋润枯黄,如奶喂养憔悴世间不经考验的虚空,两天的爱情,看见不完美拔腿就跑的友情,不能沟通的亲情……静静在自己的世界坚定地行走像莲花那样
2019-06-06作业点评感悟
叶子_早起设计师
今日感悟1、今天看群里的作业点评,卢佳老师足个作业点评分析,思维特别的清楚,每个都讲到了点子上,对于同学的作业很有帮助。对比自己更多点评作业的时候是凭借一种感觉,对于自己熟悉的人感受深刻,不熟悉的不知道如何分析,说明我了解的情况不够多,思路也比较混乱。很多时候是自己个人分析判断,没有看到事件后面的原因。需要打开思路,潜心修炼。2、今天也提到了如实描述,解决了我一直的困惑,如实描述分为对事件的如实描
第一天
UhAwww
✈机场2:00p.m.这是美国之行旅程的第一天。尽管饥饿,困顿时不时的笼罩,我们仍满身爽朗地登上了前往芝加哥的航班。芝加哥(Chicago),位于美国中西部密歇根湖的南部,是世界著名的国际金融中心之一。图片发自App图片发自App图片发自App在周途劳顿之际,我们借欣赏影片来消磨时光。各式的热茶冷饮也贴心地为我们缓解了口渴。历行十四个小时的飞行终于将我们带往了目的地。图片发自App图片发自App一
蜜源是怎么赚钱的?蜜源app怎么赚取佣金?
氧惠好项目
现在网购很盛行,在网上买东西似乎已经成为一种常态,就连现在的农村也流行起网购。大部分人在网上购物都是直接登录到电商平台,比如拼多多,淘宝或者京东,这些平台上的商品卖多少钱我们就付多少钱,最好的是搞活动的时候便宜一点。其实,我们是可以通过一些购物返利网站去网购的,通过领取购物券或者低价购买能节约不少钱。蜜源app就是这样一个购物平台,除了购物能省钱以外,还可以赚钱。那么,蜜源app怎么赚钱呢?网上说
鸿蒙HarmonyOS NEXT实战开发:自定义TabBar页签实现案例
前端_王华QAQ
鸿蒙next实战 鸿蒙 鸿蒙 鸿蒙系统 android 驱动开发 嵌入式硬件 harmonyos
介绍本示例主要介绍了TabBar中间页面如何实现有一圈圆弧外轮廓以及TabBar页签被点击之后会改变图标显示,并有一小段动画效果。效果图预览使用说明:依次点击tabBar页面,除了社区图标之外,其它图标往上移动一小段距离。实现思路场景1:TabBar中间页面实现有一圈圆弧外轮廓将Image组件外层包裹一层容器组件,通过设置borderRadius以及margin的top值实现圆弧外轮廓效果。这里b
躺平,有什么不对吗?
安静的墨凡
最近看到一个比较热门的一个话题,就是选择躺平到底对不对?所谓的躺平,就是反正努力也不一定有什么结果,我就算了,无所谓,不在努力了。与之相关的,更为可怕的一个词,就是“内卷”。正式因为严重的内卷,才导致最终大部分人的躺平。很多人觉得,躺平就是一种消极思想,绝对要不得。其实躺平只是一种在极度缺乏上升空间的环境下一个出于无奈的选择,但凡成功的可能再大一些,谁愿意躺平。在竞争空前激烈的现代社会,又有多少人
Java算法之插入排序(Insertion Sort)
持续输出...
# Java 算法 算法 java 排序算法
插入排序简介插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。这个过程像打牌时整理手中的牌一样,逐步将数据排列成有序。算法原理插入排序的工作原理如下:将第一元素视为已排序的序列。从未排序序列中取第一个元素,从已排序序列的末尾开始比较。比较如果已排序序列中的元素比待插入元素大,则将已排序序列的元素向后移动一位。重复步骤3
2023-06-15
9f0ea4660c86
以赛促学赛出精彩高新凤师实验小学一、二年级口算是数学中的重要组成部分是学生学习数学的基础为进一步提高学生的口算能力和计算速度,培养学生准确、快速、合理、灵活的口算习惯。以新课标为依据、践行学为中心的教学理念,本次核心素养测查比赛活动数学组各位老师组织安排!比赛分为班级初赛和校级级比赛两个环节,六月初,由各科任数学老师在班级内组织初步测查、选拔出班级优秀的学生参加校级比赛。经过激烈的角逐班级计算小达
赚了1780元零花钱
大师兄笔记
一.鹰19转债上市,周围的很多朋友都赚了220多块零花钱,当然也包括大师兄我自己。于是,统计了下可转债的收益,从10.21日游族转债上市到现在,陆陆续续靠可转债已经赚了1780元零花钱了。虽然叫零花钱,但这钱大师兄也没花,而是继续存储起来投资。申请可转债打新只需要不到1分钟的时间,可以说是一个省时省力的赚零花钱的好方法。趁现在这种赚钱方法还没失效,希望大家也可以用它赚到零花钱。二.10.21日到现
滑冰
五年级五班李子阳
今天上午,我的妈妈和爸爸带我一起去滑冰,这是我第一次去滑冰,我又开心,又害羞,如果让别人看到一个不会滑冰的11岁孩子,我现在实在是太丢脸了。刚到滑冰场,我们就买了几双滑冰鞋,我看着光滑的冰面,伸手摸了摸,哎呀!太滑了,我小心地穿上滑冰鞋,慢慢的走向滑冰场里面,妈妈推着我说:来吧,孩子,去滑冰。我惭愧的说:妈妈,我不会滑冰呀。妈妈说:来嘛,妈妈教你。妈妈一边推着我的肩膀,一边说:像这样,推,推,滑。
2019-03-29
李巍巍
自从开始每日更新文章,自己才发现真是井底之蛙呀,真是套路深呀。标题党,奇闻篇,隐私汇,奇幻想,各种脑洞大开的东西,可真谓是百花奇放,八仙过海呀,是人们审美情趣降低,还是世界变化太快,只想一时的痛快和发泄,自己有些看不懂。还是从自身找原因吧,是自己思想落伍了,有些跟不上的节奏,那么,多学习吧,提高认识,加深思想,总是没错的吧。
中原焦点团队网络初级第31期,金亚敏坚持分享第34天
金亚敏
今天分享的主题是:人格理论弗洛伊德是精神分析学派的创始人,他把人格结构分为三个层次:本我,自我,超我。本我遵循快乐原则,超我遵循道德原则,自我遵循现实性原则。艾森克发现了三个人格基本维度:外倾、神经质和精神质。他还与其夫人一起编制了艾森克人格问卷,专门用于测定这三个基本特质维度的个体差异。艾森克用内外倾和神经质这两个维度作为坐标轴,构成了一个直角坐标系。这个坐标中涵盖了各种人格特质。各种特质是相互
js实现队列
无俦N
javascript 开发语言 ecmascript
目录一、什么是JavaScript队列数据结构二、创建一个JavaScript队列数据结构三、封装队列方法①向队列添加元素②检查队列是否为空③获取队列的长度④从队列移除元素⑤查看队列头元素⑥清空队列⑦创建toString方法四、使用Queue类一、什么是JavaScript队列数据结构在上一篇文章中,我们了解并学习了JavaScript栈数据结构,本章开始JavaScript的队列数据结,第一章先
倒计时321天
嘿你好是我啊
写下这个倒计时数字,妈妈特意细看了看,321天,嘿嘿,321,123,有点预备加油的意思呢,咱们又离高考近了一天了,要更加努力才行,要加油啊昨晚,忘了给你买笔,你前晚交待的,笔都用光了,得买新的了,于是接你回来以后我执意带着爸爸又去了趟文具用品店,你原本坚持要和我一起去买的,谁让咱俩在回来的一路愣是没记起这事呢,可是考虑到你时间比较宝贵,我叮嘱你抓紧吃点水果,换上睡衣,马上做作业,便没再理会你的请
陪伴营·隋唐五代||唐玄宗与杨贵妃(2)16/25
铃儿响叮当的Jane
“一人得宠,鸡犬升天”,说杨贵妃不为过。杨贵妃得到重宠后,杨家所有人跟着一起富贵。她的兄弟均升为高官,甚至远房兄弟杨钊,原来是市进无赖,可是为人善计算,玄宗与杨氏诸姐妹赌博,令杨钊计算赌账,赐名国忠,身兼支部郎中等十多职务,操纵朝政。杨家大姐被封为韩国夫人,三姐封为虢国夫人,八姐封为秦国夫人。每月各赠脂粉费十万钱。虢国夫人排行第三,以天生丽质自美,不假脂粉。张祜《集灵台二首·其二》诗讽之:“虢国夫
过滤器Filter和拦截器Interceptor
Hit Beats
我的笔记 servlet
过滤器一、什么是过滤器过滤器(Filter)是JavaWeb的三大组件之一,它可以将对url资源的请求进行拦截,然后进行一些处理;使用了过滤器之后,要想访问web服务器上的资源,必须先经过滤器,过滤器处理完毕之后,才可以访问对应的资源。以这种方式,一般我们可以用来进行登录校验、敏感字符处理等操作。二、怎么使用过滤器第一步:定义一个过滤器的类,让他实现Filter接口,然后重写其中的所有方法销毁)/
Vue + Spring Boot + SQL Server + Python 部署到 Windows 服务器
Desire..
vue.js spring boot python
将Vue+SpringBoot+SQLServer+Python部署到Windows服务器上的具体步骤如下:1.准备服务器远程连接到服务器:使用远程桌面连接(RDP)登录到Windows服务器。确保有管理员权限以便进行安装和配置。网络配置:检查服务器的网络连接,并确保可以访问外网以下载必要的软件。如果服务器暂时无法联网,考虑使用本地文件进行安装。2.安装所需软件安装JDK(JavaDevelopm
谋士社区:交易中常见的5大错误!谋士社区-王多余!
王多余谋士社区
要想在合约交易中稳定盈利,避免陷阱的重要性甚于寻求盈利机会的能力。实际上,大部分经验丰富的职业交易员都认为,使交易者获得成功的往往并非什么特定的交易方法,恰恰相反,那些循规蹈矩的交易者,因为严格遵守了市场整套的交易规则,才能在市场中能进行较长的“游戏”而不会被迫出局,才能拥有获得成功的机会。以下是合约交易中普遍存在的、极易发生的5大错误(未按特定顺序排行):1.在交易执行前未制定周详的交易计划如果
2022年京东双十二什么时候开始?玩法有哪些?
高省APP珊珊
2022年京东双十二活动从什么时候正式开启,今年的双十二活动和之前的比有哪些不太一样的地方,具体满减规则如何呢,以下我们来看下双十二京东满减规则介绍。高省APP,是2022年推出的平台,0投资,0风险、高省APP佣金更高,模式更好,终端用户不流失。【高省】是一个自用省钱佣金高,分享推广赚钱多的平台,百度有几百万篇报道,也期待你的加入。珊珊导师,高省邀请码666123,注册送2皇冠会员,送万元推广大
配音兼职一天能赚钱多少?配音有哪些兼职平台?
配音新手圈
应该有不少的小伙伴都对配音感兴趣,不仅能满足自己角色扮演的欲望,还能够通过演绎角色体验不同角色的人生,发泄自己的情绪,有些人一开始应该只是单纯热爱的配音,但配音久了,难免也会升起靠配音赚钱的念头,那么配音兼职一天收入有多少?如果只是想简单的读读文章做做文案配音的话,有哪些兼职平台?小编这就为你揭晓答案。一、配音兼职一天收入有多少1.看自己配音任务的甲方预算以及自己加入的平台,如果是简单的文案配音,
儿子的情书
不甘平庸的艳子
前天,无意间,看到儿子夹在书包内层的一纸情书和几只千纸鸽。字迹由刚开始的工整到未尾的潦草拥挤,行文流畅,感情真挚,爱意满满,情真意切,情长纸短,仿佛有很多话想对对方说。尤其说了自己胆小怕虫子恐高,对方女生怕黑,自己能力有限,但为了要保护对方,自己一定会变得强大起来。我默默地看完,原封不动折回去,就像没有看到过一样。昨天孩爸也一样无意间发现了,立马气愤的拿给我看。我示意他赶紧放回去。孩子只有十六岁,
开发MFC界面爬取图片工具三(结合MFC界面时遇到的问题及解决方法)
吾名招财
MFC界面应用 c++ mfc
结合MFC界面时遇到的问题及解决方法引言开发中涉及到的一些问题及解决方法1.引入头文件问题2.接收内容的格式转换问题(CString转string,CString转int)3.CString类型字符串中的字符替换问题4.创建线程问题(1)创建下载线程(2)创建判断线程5.如何实现编辑框追加文本问题6.URLDownloadToFile函数中参数格式问题(string转换为LPCWSTR)7.获取已
day 13 关闭SElinux
Linux_淡忘
Day13作者:翟玉龙归档:命令笔记2019/3/18快捷键:Ctrl+1标题1Ctrl+2标题2Ctrl+3标题3Ctrl+4实例Ctrl+5程序代码Ctrl+6正文格式说明:蓝色字体:注释黄色背景:重要绿色背景:注意老男孩教育教学核心思想6重:重目标、重思路、重方法、重实践、重习惯、重总结学无止境,老男孩教育成就你人生的起点!联系方式:网站运维QQ交流群:Linux385168604架构师39
微信小程序:自定义 tabBar 效果
孤安先生
全栈开发学习日记 # 第十二章:微信小程序 微信小程序 小程序 前端 javascript
自定义tabBar效果自定义tabBar在app.json中的tabBar里设置custom为true就可以关闭原生tabBar。开启自定义tabBar原生的tabBar内容不删除,兼容低版本。{//注册vant组件"usingComponents":{"van-tabbar":"@vant/weapp/tabbar/index","van-tabbar-item":"@vant/weapp/ta
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