http://hualong.iteye.com/blog/2102798
这几天研究了下Cobar, Cobar是阿里巴巴研发的关系型数据的分布式处理系统(Amoeba的升级版,该产品成功替代了原先基于Oracle的数据存储方案,目前已经接管了3000+个MySQL数据库的schema,平均每天处理近50亿次的SQL执行请求。)(github上面的是源码,大家下来需要自己用maven2编译后运行、者放Eclipse里面运行,一开始我用maven3没有执行成功。) 首先,使用Cobar的核心功能如下: 分布式: Cobar的分布式主要是通过将表放入不同的库来实现: 1. Cobar支持将一张表水平拆分成多份分别放入不同的库来实现表的水平拆分 2. Cobar也支持将不同的表放入不同的库 3. 多数情况下,用户会将以上两种方式混合使用 这里需要强调的是,Cobar不支持将一张表,例如test表拆分成test_1, test_2, test_3.....放在同一个库中,必须将拆分后的表分别放入不同的库来实现分布式。 HA: 在用户配置了MySQL心跳的情况下,Cobar可以自动向后端连接的MySQL发送心跳,判断MySQL运行状况,一旦运行出现异常,Cobar可以自动切换到备机工作。但需要强调的是: 1. Cobar的主备切换有两种触发方式,一种是用户手动触发,一种是Cobar的心跳语句检测到异常后自动触发。那么,当心跳检测到主机异常,切换到备机,如果主机恢复了,需要用户手动切回主机工作,Cobar不会在主机恢复时自动切换回主机,除非备机的心跳也返回异常。 2. Cobar只检查MySQL主备异常,不关心主备之间的数据同步,因此用户需要在使用Cobar之前在MySQL主备上配置双向同步,详情可以参阅MySQL参考手册。 其次,我们也需要注意Cobar的功能约束: 1) 不支持跨库情况下的join、分页、排序、子查询操作。 2) SET语句执行会被忽略,事务和字符集设置除外。 3) 分库情况下,insert语句必须包含拆分字段列名。 4) 分库情况下,update语句不能更新拆分字段的值。 5) 不支持SAVEPOINT操作。 6) 暂时只支持MySQL数据节点。 7) 使用JDBC时,不支持rewriteBatchedStatements=true参数设置(默认为false)。 8) 使用JDBC时,不支持useServerPrepStmts=true参数设置(默认为false)。 9) 使用JDBC时,BLOB, BINARY, VARBINARY字段不能使用setBlob()或setBinaryStream()方法设置参数。 然后,我们来分析一下Cobar逻辑层次图: * dataSource:数据源,表示一个具体的数据库连接,与物理存在的数据库schema一一对应。 * dataNode:数据节点,由主、备数据源,数据源的HA以及连接池共同组成,可以将一个dataNode理解为一个分库。 * table:表,包括拆分表(如tb1,tb2)和非拆分表。 * tableRule:路由规则,用于判断SQL语句被路由到具体哪些datanode执行。 * schema:cobar可以定义包含拆分表的schema(如schema1),也可以定义无拆分表的schema(如schema2)。 Cobar支持的数据库结构(schema)的层次关系具有较强的灵活性,用户可以将表自由放置不同的datanode,也可将不同的datasource放置在同一MySQL实例上。在实际应用中,我们需要通过配置文件(schema.xml)来定义我们需要的数据库服务器和表的分布策略,这点我们将在后面的安装和配置部分中介绍到。 接着,我们来介绍Cobar的安装和配置步骤: 下面我们将使用一个最简单的分库分表的例子来说明Cobar的基本用法,数据库schema如下图(该实例也可参考:Cobar产品首页)。 1) 系统对外提供的数据库名是dbtest,并且其中有两张表tb1和tb2。 2) tb1表的数据被映射到物理数据库dbtest1的tb1上。 3) tb2表的一部分数据被映射到物理数据库dbtest2的tb2上,另外一部分数据被映射到物理数据库dbtest3的tb2上。 1、环境准备 操作系统:Linux或者Windows (推荐在Linux环境下运行Cobar) MySQL:http://www.mysql.com/downloads/ (推荐使用5.1以上版本) JDK:http://www.oracle.com/technetwork/java/javase/downloads/ (推荐使用1.6以上版本) Cobar:https://github.com/alibaba/cobar (下载tar.gz或者zip文件,特意说明下,阿里的开源全部移到github上去了,里面有很多阿里人的作品,当然包含著名的dubbo,地址是:https://github.com/alibaba/) 2、数据准备 假设本文MySQL所在服务器IP为192.168.0.1,端口为3306,用户名为test,密码为空,我们需要创建schema:dbtest1、dbtest2、dbtest3,table:tb1、tb2,SQL如下:
[sql] view plain copy
1. #创建dbtest1
2. drop database if exists dbtest1;
3. create database dbtest1;
4. use dbtest1;
5. #在dbtest1上创建tb1
6. create table tb1(
7. id int not null ,
8. gmt datetime);
9.
10. #创建dbtest2
11. drop database if exists dbtest2;
12. create database dbtest2;
13. use dbtest2;
14. #在dbtest2上创建tb2
15. create table tb2(
16. id int not null ,
17. val varchar (256));
18.
19. #创建dbtest3
20. drop database if exists dbtest3;
21. create database dbtest3;
22. use dbtest3;
23. #在dbtest3上创建tb2
24. create table tb2(
25. id int not null ,
26. val varchar (256));
3、配置Cobar Cobar解压之后有四个目录: bin/:可执行文件目录,包含启动(start)、关闭(shutdown)和重启(restart)脚本 lib/:逻辑类库目录,包含了Cobar所需的jar包 conf/:配置文件目录,下面会详细介绍 logs/:运行日志目录,最主要的log有两个:程序日志(stdout.log)和控制台输出(console.log) 配置文件的用法如下: log4j.xml:日志配置,一般来说保持默认即可 schema.xml:定义了schema逻辑层次图中的所有元素,并利用这些元素以及rule.xml中定义的规则组建分布式数据库系统 rule.xml:定义了分库分表的规则 server.xml:系统配置文件 我们在schema.xml中配置数据库结构(schema)、数据节点(dataNode)、以及数据源(dataSource)。
[html] view plain copy
1. version ="1.0" encoding ="UTF-8" ?>
2. >
3. xmlns:cobar ="http://cobar.alibaba.com/" >
4.
5.
6. name ="dbtest" dataNode ="dnTest1" >
7. name ="tb2" dataNode ="dnTest2,dnTest3" rule ="rule1" />
8.
9.
10.
11. name ="dnTest1" >
12. name ="dataSource" >
13. dsTest[0]
14.
15.
16. name ="dnTest2" >
17. name ="dataSource" >
18. dsTest[1]
19.
20.
21. name ="dnTest3" >
22. name ="dataSource" >
23. dsTest[2]
24.
25.
26.
27.
28. name ="dsTest" type ="mysql" >
29. name ="location" >
30. 192.168.0.1:3306/dbtest1
31. 192.168.0.1:3306/dbtest2
32. 192.168.0.1:3306/dbtest3
33.
34. name ="user" > test
35. name ="password" > test
36. name ="sqlMode" > STRICT_TRANS_TABLES
37.
38.
我们注意到,上述配置实际上已经把图2中的数据库结构配置好了。dbtest主要映射的是dnTest1库(即192.168.0.1:3306/dbtest1库),而其中的tb2表则是按照规则rule1,被分配到dnTest2库(即192.168.0.1:3306/dbtest2库)和dnTest3库(即192.168.0.1:3306/dbtest3库)中。此外,规则rule1的定义可以在rule.xml中找到,代码如下:
[html] view plain copy
1. version ="1.0" encoding ="UTF-8" ?>
2. >
3. xmlns:cobar ="http://cobar.alibaba.com/" >
4.
5.
6. name ="rule1" >
7.
8. id
9.
10.
11.
12.
13.
14. name ="func1" class ="com.alibaba.cobar.route.function.PartitionByLong" >
15. name ="partitionCount" > 2
16. name ="partitionLength" > 512
17.
18.
结合schema.xml中的内容,我们可以看出分表的规则是,按照id字段把tb2表中的数据分配到dnTest2和dnTest3两个分区中,其中id小于512的数据会被放到dnTest2库的分区中,而其余的会被放到dnTest3库的分区中,更多路由算法可以参考《路由文档 》。最后,我们来看一下server.xml的配置,代码如下。
[html] view plain copy
1. version ="1.0" encoding ="UTF-8" ?>
2. >
3. xmlns:cobar ="http://cobar.alibaba.com/" >
4.
5.
6. name ="root" >
7. name ="password" > passwd
8. name ="schemas" > dbtest
9.
10.
这里的server.xml配置比较简单,只配置了本地Cobar服务的数据库结构、用户名和密码。在启动Cobar服务之后,使用用户名root和密码passwd就可以登录Cobar服务。 4、运行Cobar 启动Cobar服务很简单,运用bin目录下的start.sh即可(停止使用shutdown.sh)。启动成功之后,可以在logs目录下的stdout.log中看到如下日志:
[html] view plain copy
1. 10:54:19,264 INFO ===============================================
2. 10:54:19,265 INFO Cobar is ready to startup ...
3. 10:54:19,265 INFO Startup processors ...
4. 10:54:19,443 INFO Startup connector ...
5. 10:54:19,446 INFO Initialize dataNodes ...
6. 10:54:19,470 INFO dnTest1:0 init success
7. 10:54:19,472 INFO dnTest3:0 init success
8. 10:54:19,473 INFO dnTest2:0 init success
9. 10:54:19,481 INFO CobarManager is started and listening on 9066
10. 10:54:19,483 INFO CobarServer is started and listening on 8066
11. 10:54:19,484 INFO ===============================================
接着,我们就可以使用“mysql -h127.0.0.1 -uroot -ppasswd -P8066 -Ddbtest”命令来登录Cobar服务了,再接下来的操作就和在其他MySQL Client中一样了。比如,我们可以使用“show databases”命令查看数据库,使用“show tables”命令查看数据表,如下图: 接着,我们按照下图中的SQL指定向数据表插入测试记录。 可以看到,这里的tb2中包含了id为1、2、513的3条记录。而实际上,这3条记录存储在不同的物理数据库上的,大家可以到物理库上验证一下。 至于Cobar的连接和使用方法和MySQL一样,Java程序中可以使用JDBC(建议5.1以上的版本),PHP中可以使用PDO。当然,Cobar还提供HA、集群等高级的功能,更多信息请参考其《产品文档 》。此外,产品文档中还为我们提供了详细的PPT文档《Cobar原理及应用.ppt》来介绍Cobar在实际生产环境中的使用方法。 此外,特别解释一下大家可能比较关心的心跳检测问题,Cobar的心跳检测主要用在以下两个地方。 1、在配置数据节点的时候,我们需要使用心跳检测来探测数据节点的运行状况。Cobar中使用执行SQL的方式来进行探测,简单且实用。例如,我们可以把前面实例中的schema.xml中的dataNode配置成下面的样子。
[html] view plain copy
1. ... ...
2.
3. name ="dnTest1" >
4. name ="dataSource" >
5. dsTest[0]
6.
7.
8. name ="poolSize" > 256
9.
10.
11. name ="heartbeat" > select user()
12.
13. ... ...
2、当我们需要对Cobar作集群(cluster),进行负载均衡的时候,我们也需要用到心跳机制。不过此处的配置则是在server.xml中,代码如下:
[html] view plain copy
1. ... ...
2.
3.
4.
5. name ="cobar1" >
6.
7. name ="host" > 192.168.0.1
8.
9. name ="weight" > 1
10.
11.
12. name ="cobar2" >
13. name ="host" > 192.168.0.2
14. name ="weight" > 2
15.
16.
17. name ="cobar3" >
18. name ="host" > 192.168.0.3
19. name ="weight" > 3
20.
21.
22. name ="group12" >
23. name ="nodeList" > cobar1,cobar2
24.
25. name ="group23" >
26. name ="nodeList" > cobar2,cobar3
27.
28.
29. ... ...
最后,简单看一下Cobar的实现原理。 首先是系统模块架构。 从上图中可以看到,Cobar的前、后端模块都实现了MySQL协议;当接受到SQL请求时,会依次进行解释(SQL Parser)和路由(SQL Router)工作,然后使用SQL Executor去后端模块获取数据集(后端模块还负责心跳检测功能);如果数据集来自多个数据源,Cobar则需要把数据集进行组合(Result Merge),最后返回响应。整个过程应该比较容易理解, 下面是Cobar的网络通讯模块架构。 从上图中可以看出,Cobar采用了主流的Reactor设计模式来处理请求,并使用NIO进行底层的数据交换,这大大提升系统的负载能力。其中,NIOAcceptor用于处理前端请求,NIOConnector则用于管理后端的连接,NIOProcessor用于管理多线程事件处理,NIOReactor则用于完成底层的事件驱动机制,就是看起来和Mina和Netty的网络模型比较相似。如果有兴趣,大家还可以到Cobar站点的下载页面(https://github.com/alibaba/cobar)获取该项目的源码,感谢阿里人的付出!
最后说点题外话,目前国内关于mysql分布式中间有
360公司的Atlas:http://www.guokr.com/blog/475765/
淘宝的tddl:http://www.guokr.com/blog/475765/
京东的蓝海豚:http://cio.zdnet.com.cn/cio/2014/0731/3028990.shtml?fromrss=rss
网易的DDB:http://wenku.baidu.com/link?url=TiILF6KxWQBUu1bj2n8mA1E-_-RUESzjI7ALpo-mDWXW9uQv-0PCjmJrl9QH6ijP1ycFTXyz3plcrWgXOV80snuIVcMkLYNNKJA3EujCPTG
但是还是阿里的cobar好些,因为他开源了,除了中间件本身,还开源提供驱动、管理器。
这几天研究了下Cobar, Cobar是阿里巴巴研发的关系型数据的分布式处理系统(Amoeba的升级版,该产品成功替代了原先基于Oracle的数据存储方案,目前已经接管了3000+个MySQL数据库的schema,平均每天处理近50亿次的SQL执行请求。)(github上面的是源码,大家下来需要自己用maven2编译后运行、者放Eclipse里面运行,一开始我用maven3没有执行成功。) 首先,使用Cobar的核心功能如下: 分布式: Cobar的分布式主要是通过将表放入不同的库来实现: 1. Cobar支持将一张表水平拆分成多份分别放入不同的库来实现表的水平拆分 2. Cobar也支持将不同的表放入不同的库 3. 多数情况下,用户会将以上两种方式混合使用 这里需要强调的是,Cobar不支持将一张表,例如test表拆分成test_1, test_2, test_3.....放在同一个库中,必须将拆分后的表分别放入不同的库来实现分布式。 HA: 在用户配置了MySQL心跳的情况下,Cobar可以自动向后端连接的MySQL发送心跳,判断MySQL运行状况,一旦运行出现异常,Cobar可以自动切换到备机工作。但需要强调的是: 1. Cobar的主备切换有两种触发方式,一种是用户手动触发,一种是Cobar的心跳语句检测到异常后自动触发。那么,当心跳检测到主机异常,切换到备机,如果主机恢复了,需要用户手动切回主机工作,Cobar不会在主机恢复时自动切换回主机,除非备机的心跳也返回异常。 2. Cobar只检查MySQL主备异常,不关心主备之间的数据同步,因此用户需要在使用Cobar之前在MySQL主备上配置双向同步,详情可以参阅MySQL参考手册。 其次,我们也需要注意Cobar的功能约束: 1) 不支持跨库情况下的join、分页、排序、子查询操作。 2) SET语句执行会被忽略,事务和字符集设置除外。 3) 分库情况下,insert语句必须包含拆分字段列名。 4) 分库情况下,update语句不能更新拆分字段的值。 5) 不支持SAVEPOINT操作。 6) 暂时只支持MySQL数据节点。 7) 使用JDBC时,不支持rewriteBatchedStatements=true参数设置(默认为false)。 8) 使用JDBC时,不支持useServerPrepStmts=true参数设置(默认为false)。 9) 使用JDBC时,BLOB, BINARY, VARBINARY字段不能使用setBlob()或setBinaryStream()方法设置参数。 然后,我们来分析一下Cobar逻辑层次图: * dataSource:数据源,表示一个具体的数据库连接,与物理存在的数据库schema一一对应。 * dataNode:数据节点,由主、备数据源,数据源的HA以及连接池共同组成,可以将一个dataNode理解为一个分库。 * table:表,包括拆分表(如tb1,tb2)和非拆分表。 * tableRule:路由规则,用于判断SQL语句被路由到具体哪些datanode执行。 * schema:cobar可以定义包含拆分表的schema(如schema1),也可以定义无拆分表的schema(如schema2)。 Cobar支持的数据库结构(schema)的层次关系具有较强的灵活性,用户可以将表自由放置不同的datanode,也可将不同的datasource放置在同一MySQL实例上。在实际应用中,我们需要通过配置文件(schema.xml)来定义我们需要的数据库服务器和表的分布策略,这点我们将在后面的安装和配置部分中介绍到。 接着,我们来介绍Cobar的安装和配置步骤: 下面我们将使用一个最简单的分库分表的例子来说明Cobar的基本用法,数据库schema如下图(该实例也可参考:Cobar产品首页)。 1) 系统对外提供的数据库名是dbtest,并且其中有两张表tb1和tb2。 2) tb1表的数据被映射到物理数据库dbtest1的tb1上。 3) tb2表的一部分数据被映射到物理数据库dbtest2的tb2上,另外一部分数据被映射到物理数据库dbtest3的tb2上。 1、环境准备 操作系统:Linux或者Windows (推荐在Linux环境下运行Cobar) MySQL:http://www.mysql.com/downloads/ (推荐使用5.1以上版本) JDK:http://www.oracle.com/technetwork/java/javase/downloads/ (推荐使用1.6以上版本) Cobar:https://github.com/alibaba/cobar (下载tar.gz或者zip文件,特意说明下,阿里的开源全部移到github上去了,里面有很多阿里人的作品,当然包含著名的dubbo,地址是:https://github.com/alibaba/) 2、数据准备 假设本文MySQL所在服务器IP为192.168.0.1,端口为3306,用户名为test,密码为空,我们需要创建schema:dbtest1、dbtest2、dbtest3,table:tb1、tb2,SQL如下:
[sql] view plain copy
1. # 创建 dbtest1
2. drop database if exists dbtest1;
3. create database dbtest1;
4. use dbtest1;
5. # 在 dbtest1 上创建 tb1
6. create table tb1(
7. id int not null ,
8. gmt datetime);
9.
10. # 创建 dbtest2
11. drop database if exists dbtest2;
12. create database dbtest2;
13. use dbtest2;
14. # 在 dbtest2 上创建 tb2
15. create table tb2(
16. id int not null ,
17. val varchar (256));
18.
19. # 创建 dbtest3
20. drop database if exists dbtest3;
21. create database dbtest3;
22. use dbtest3;
23. # 在 dbtest3 上创建 tb2
24. create table tb2(
25. id int not null ,
26. val varchar (256));
3、配置 Cobar Cobar 解压之后有四个目录: bin/ :可执行文件目录,包含启动( start)、关闭( shutdown)和重启( restart)脚本 lib/ :逻辑类库目录,包含了 Cobar所需的 jar包 conf/ :配置文件目录,下面会详细介绍 logs/ :运行日志目录,最主要的 log有两个:程序日志( stdout.log)和控制台输出( console.log) 配置文件的用法如下: log4j.xml :日志配置,一般来说保持默认即可 schema.xml :定义了 schema逻辑层次图中的所有元素,并利用这些元素以及 rule.xml中定义的规则组建分布式数据库系统 rule.xml :定义了分库分表的规则 server.xml :系统配置文件 我们在 schema.xml中配置数据库结构( schema)、数据节点( dataNode)、以及数据源( dataSource)。
[html] view plain copy
1. version = "1.0" encoding = "UTF-8" ?>
2. >
3. xmlns:cobar = "http://cobar.alibaba.com/" >
4.
5.
6. name = "dbtest" dataNode = "dnTest1" >
7. name = "tb2" dataNode = "dnTest2,dnTest3" rule = "rule1" />
8.
9.
10.
11. name = "dnTest1" >
12. name = "dataSource" >
13. dsTest[0]
14.
15.
16. name = "dnTest2" >
17. name = "dataSource" >
18. dsTest[1]
19.
20.
21. name = "dnTest3" >
22. name = "dataSource" >
23. dsTest[2]
24.
25.
26.
27.
28. name = "dsTest" type = "mysql" >
29. name = "location" >
30. 192.168.0.1:3306/dbtest1
31. 192.168.0.1:3306/dbtest2
32. 192.168.0.1:3306/dbtest3
33.
34. name = "user" > test
35. name = "password" > test
36. name = "sqlMode" > STRICT_TRANS_TABLES
37.
38.
我们注意到,上述配置实际上已经把图 2中的数据库结构配置好了。 dbtest主要映射的是 dnTest1库(即 192.168.0.1:3306/dbtest1库),而其中的 tb2表则是按照规则 rule1,被分配到 dnTest2库(即 192.168.0.1:3306/dbtest2库)和 dnTest3库(即 192.168.0.1:3306/dbtest3库)中。此外,规则 rule1的定义可以在 rule.xml中找到,代码如下:
[html] view plain copy
1. version = "1.0" encoding = "UTF-8" ?>
2. >
3. xmlns:cobar = "http://cobar.alibaba.com/" >
4.
5.
6. name = "rule1" >
7.
8. id
9.
10.
11.
12.
13.
14. name = "func1" class = "com.alibaba.cobar.route.function.PartitionByLong" >
15. name = "partitionCount" > 2
16. name = "partitionLength" > 512
17.
18.
结合 schema.xml中的内容,我们可以看出分表的规则是,按照 id字段把 tb2表中的数据分配到 dnTest2和 dnTest3两个分区中,其中 id小于 512的数据会被放到 dnTest2库的分区中,而其余的会被放到 dnTest3库的分区中,更多路由算法可以参考《 路由文档 》。最后,我们来看一下 server.xml的配置,代码如下。
[html] view plain copy
1. version = "1.0" encoding = "UTF-8" ?>
2. >
3. xmlns:cobar = "http://cobar.alibaba.com/" >
4.
5.
6. name = "root" >
7. name = "password" > passwd
8. name = "schemas" > dbtest
9.
10.
这里的 server.xml配置比较简单,只配置了本地 Cobar服务的数据库结构、用户名和密码。在启动 Cobar服务之后,使用用户名 root和密码 passwd就可以登录 Cobar服务。 4、运行 Cobar 启动 Cobar服务很简单,运用 bin目录下的 start.sh即可(停止使用 shutdown.sh)。启动成功之后,可以在 logs目录下的 stdout.log中看到如下日志:
[html] view plain copy
1. 10:54:19,264 INFO ===============================================
2. 10:54:19,265 INFO Cobar is ready to startup ...
3. 10:54:19,265 INFO Startup processors ...
4. 10:54:19,443 INFO Startup connector ...
5. 10:54:19,446 INFO Initialize dataNodes ...
6. 10:54:19,470 INFO dnTest1:0 init success
7. 10:54:19,472 INFO dnTest3:0 init success
8. 10:54:19,473 INFO dnTest2:0 init success
9. 10:54:19,481 INFO CobarManager is started and listening on 9066
10. 10:54:19,483 INFO CobarServer is started and listening on 8066
11. 10:54:19,484 INFO ===============================================
接着,我们就可以使用 “mysql -h127.0.0.1 -uroot -ppasswd -P8066 -Ddbtest”命令来登录 Cobar服务了,再接下来的操作就和在其他 MySQL Client中一样了。比如,我们可以使用 “show databases”命令查看数据库,使用 “show tables”命令查看数据表,如下图: 接着,我们按照下图中的 SQL指定向数据表插入测试记录。 可以看到,这里的 tb2中包含了 id为 1、 2、 513的 3条记录。而实际上,这 3条记录存储在不同的物理数据库上的,大家可以到物理库上验证一下。 至于 Cobar的连接和使用方法和 MySQL一样, Java程序中可以使用 JDBC(建议 5.1以上的版本), PHP中可以使用 PDO。当然, Cobar还提供 HA、集群等高级的功能,更多信息请参考其《 产品文档 》。此外,产品文档中还为我们提供了详细的 PPT文档《 Cobar原理及应用 .ppt》来介绍 Cobar在实际生产环境中的使用方法。 此外,特别解释一下大家可能比较关心的心跳检测问题, Cobar 的心跳检测主要用在以下两个地方。 1 、在配置数据节点的时候,我们需要使用心跳检测来探测数据节点的运行状况。 Cobar中使用执行 SQL的方式来进行探测,简单且实用。例如,我们可以把前面实例中的 schema.xml中的 dataNode配置成下面的样子。
[html] view plain copy
1. ... ...
2.
3. name = "dnTest1" >
4. name = "dataSource" >
5. dsTest[0]
6.
7.
8. name = "poolSize" > 256
9.
10.
11. name = "heartbeat" > select user()
12.
13. ... ...
2、当我们需要对 Cobar作集群( cluster),进行负载均衡的时候,我们也需要用到心跳机制。不过此处的配置则是在 server.xml中,代码如下:
[html] view plain copy
1. ... ...
2.
3.
4.
5. name = "cobar1" >
6.
7. name = "host" > 192.168.0.1
8.
9. name = "weight" > 1
10.
11.
12. name = "cobar2" >
13. name = "host" > 192.168.0.2
14. name = "weight" > 2
15.
16.
17. name = "cobar3" >
18. name = "host" > 192.168.0.3
19. name = "weight" > 3
20.
21.
22. name = "group12" >
23. name = "nodeList" > cobar1,cobar2
24.
25. name = "group23" >
26. name = "nodeList" > cobar2,cobar3
27.
28.
29. ... ...
最后,简单看一下 Cobar 的实现原理。 首先是系统模块架构。 从上图中可以看到, Cobar的前、后端模块都实现了 MySQL协议;当接受到 SQL请求时,会依次进行解释( SQL Parser)和路由( SQL Router)工作,然后使用 SQL Executor去后端模块获取数据集(后端模块还负责心跳检测功能);如果数据集来自多个数据源, Cobar则需要把数据集进行组合( Result Merge),最后返回响应。整个过程应该比较容易理解, 下面是 Cobar的网络通讯模块架构。 从上图中可以看出, Cobar采用了主流的 Reactor设计模式来处理请求,并使用 NIO进行底层的数据交换,这大大提升系统的负载能力。其中, NIOAcceptor用于处理前端请求, NIOConnector则用于管理后端的连接, NIOProcessor用于管理多线程事件处理, NIOReactor则用于完成底层的事件驱动机制,就是看起来和 Mina和 Netty的网络模型比较相似。如果有兴趣,大家还可以到 Cobar站点的下载页面( https://github.com/alibaba/cobar )获取该项目的源码,感谢阿里人的付出!
最后说点题外话,目前国内关于mysql分布式中间有
360公司的 Atlas: http://www.guokr.com/blog/475765/
淘宝的tddl: http://www.guokr.com/blog/475765/
京东的 蓝海豚: http://cio.zdnet.com.cn/cio/2014/0731/3028990.shtml?fromrss=rss
网易的DDB: http://wenku.baidu.com/link?url=TiILF6KxWQBUu1bj2n8mA1E-_-RUESzjI7ALpo-mDWXW9uQv-0PCjmJrl9QH6ijP1ycFTXyz3plcrWgXOV80snuIVcMkLYNNKJA3EujCPTG
但是还是阿里的cobar好些,因为他开源了,除了中间件本身,还开源提供驱动、管理器。
你可能感兴趣的:(java,database)
蓝桥杯——算法训练——粘木棍
大柠丶
蓝桥杯 蓝桥杯 算法 职场和发展
问题描述有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。输入格式第一行两个整数N,M。一行N个整数,表示木棍的长度。输出格式一行一个整数,表示最小的差距样例输入32102040样例输出10数据规模和约定N,M<=7packagecom.study.蓝桥杯.算法训练;importjava.util.Arrays;importjava.util.Scanner;/***@autho
蓝桥杯——算法训练——共线
大柠丶
蓝桥杯 蓝桥杯 算法 职场和发展
问题描述给定2维平面上n个整点的坐标,一条直线最多能过几个点?输入格式第一行一个整数n表示点的个数以下n行,每行2个整数分别表示每个点的x,y坐标。输出格式输出一个整数表示答案。样例输入50011220323样例输出3数据规模和约定n<=1500,数据保证不会存在2个相同的点。点坐标在int范围内importjava.util.Scanner;/***@authorsjn*@date2022-2-
深入解析 Java Stream API:从 List 到 Map 的优雅转换!!!
小丁学Java
# Lambda表达式 # 方法引用 # Stream java list Stream Lambda 表达式 方法引用 map Collectors
深入解析JavaStreamAPI:从List到Map的优雅转换大家好!今天我们来聊聊Java8中一个非常常见的操作:使用StreamAPI将List转换为Map。具体来说,我们将深入分析以下代码片段:MapinviteCodeMap=inviteCodes.stream().collect(Collectors.toMap(InviteCode::getId,ic->ic));这段代码看似简单,
java用来模块化开发和扩展很有用的服务加载器 ServiceLoader类实现SPI机制
爱的叹息
Java 基础整理 java 开发语言
java.util.ServiceLoader是Java中用于实现服务提供者接口(ServiceProviderInterface,SPI)机制的一个工具。SPI允许你在不修改现有代码的情况下,动态地加载和使用第三方实现。这在插件化设计、模块化开发和扩展性需求中非常有用。基本概念服务接口(ServiceInterface):定义了服务的接口。服务提供者(ServiceProvider):实现了服务
js在html有几种存在方式,JavaScript输出方式有哪些?
王若琳
js在html有几种存在方式
JavaScript输出方式有哪些?下面本篇文章给大家介绍一下JavaScript常见的输出方式。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.通过弹窗的形式来输出alert(需要输出的内容);alert("helloworld");confirm(需要输出的内容);confirm("你好吗?");prompt(需要输出的内容);prompt("请输入内容:");注意点:如果
判断html标签是否存在,jquery怎么判断标签元素是否存在?
BugHunter666
判断html标签是否存在
jquery怎么判断标签元素是否存在?下面本篇文章给大家介绍一下在jquery中判断页面标签元素是否存在的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。jquery判断页面标签元素是否存在在传统的Javascript里,当我们对某个页面元素进行某种操作前,最好先判断这个元素是否存在。原因是对一个不存在的元素进行操作是不允许的。例如:document.getElementBy
python列表操作计算列表长度并输出,Python基础2:列表
想吃草莓干
一、列表列表是按照特定顺序的排列组合,就像数学中的数列,列表中的元素具有⼀定的排列顺序。在Python中,列表用方括号[]来表示列表,比如:>>>a=['Python','C','Java']1、访问列表中的元素索引开始:0如果我们想要打印上述列表中Python,就需要我们访问列表中第一个元素,在Python中,列表的访问从0开始,索引数为元素的位置减去1,访问的元素位置放在方括号里面,如果我们想
JavaScript数组-遍历数组
咖啡の猫
javascript 开发语言
在JavaScript开发过程中,数组是一种非常常见且强大的数据结构,用于存储一系列有序的数据项。遍历数组是处理这些数据项的基础操作之一,无论是为了显示、转换还是过滤数据。本文将详细介绍几种常见的遍历数组的方法及其应用场景,帮助你选择最适合当前任务的方式。一、为什么需要遍历数组?遍历数组意味着逐一访问数组中的每个元素,以便执行特定的操作,如打印输出、修改值或基于条件筛选数据。不同的场景可能需要不同
摸鱼神器(保持Teams一直处于绿色状态)
PhilipJ0303
java
packageorg.cloud.sonic.controller.tools;importjava.awt.*;importjava.time.DayOfWeek;importjava.time.LocalDateTime;importjava.time.LocalTime;/***@authorPhilipLee*@date2024/1/916:10*/publicclassTest{publ
请列举你所了解的测试工具
cfjybgkmf
软件工程课程作业 软件工程
测试管理:svn、git白盒测试工具:jtestjava代码扫描工具:findbugs、TscanCode网络测试工具:wireshark、tcapp自动化工具:uiautomator
JAVA代码实现ElasticSearch搜索(入门-进阶)(一):搜索方法、多字段查询、高亮展示
majunssz
elasticsearch elasticsearch
一、搜索方法对比首先存入一条数据count="ilikeeatingandkuing"默认分词器应该将内容分为“i”“like”“eating”“and”“kuing”1.QueryBuilders.matchQuery("count",count);会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到。count="i"可查出count="ili"可查出co
java毕业设计,网上商城系统
爱编程的小哥
java毕设 java 课程设计 spring boot vue
️OnlineMall商城系统全解析|Vue3+SpringBoot全栈实战(附高并发与数据安全方案)一、系统架构全景基于七张效果图分析,该系统是企业级电商综合管理平台,采用SpringBoot3+Vue3+ElementPlus+MyBatisPlus技术栈,覆盖商品管理、订单处理、会员运营等核心场景。通过RBAC权限控制+Elasticsearch搜索+分布式事务三大技术亮点,支持10万级商品
java将动态图转换成静态图_如何用最简单的方法把静态图变成动图?
PEI Lobster
java将动态图转换成静态图
在今日头条浏览文章时,我们经常会看到有些作者在文章中插入了一些动态图片,不但美化了页面,而且起到了简明扼要的说明作用,让读者对文章内容加深了理解,也提高了文章的阅读量和点击量。这样的动态效果是如何制作的呢?主要有两个步骤:首先要制作出图片动态效果的视频,一般是MP4格式,第二步用格式工厂等文件格式转换软件,把MP4转换为gif动画格式,然后就可以把它插入到网页中。这其中的难点和重点就在于制作图片的
Angular 编译前的脚本执行
t0_54manong
编程问题解决手册 angular.js 前端 javascript 个人开发
在使用Angular开发项目时,有时候我们需要在每次编译之前执行特定的脚本或JavaScript函数。这在开发环境中非常有用,比如运行某些预处理、清理或其他自定义逻辑。今天我们将探讨如何在Angularv17结合esbuild实现这个功能。问题背景假设你正在使用Angularv17进行开发,并且已经配置了esbuild作为构建工具。现在你需要在每次Angular编译之前(特别是使用ngwatch时
2023华为OD机试真题-最佳对手(JAVA、Python、C++)
huaweiod123
华为OD机试真题2023 java c++ 算法 华为 python
题目描述:游戏里面,队伍通过匹配实力相近的对手进行对战。但是如果匹配的队伍实例相差太大,对于双方游戏体验都不会太好。给定n个队伍的实力值,对其进行两两实力匹配,两支队伍实例差距在允许的最大差距d内,则可以匹配。要求在匹配队伍最多的情况下,匹配出的各组实力差距的总和最小。输入描述:第一行,n,d。队伍个数n。允许的最大实力差距d。(2<=n<=50,0<=d<=100)。第二行,n个队伍的实力值,空
华为OD机试E卷 - 最佳对手 / 实力差距最小总和(Java & Python& JS & C++ & C )
算法大师
java python javascript c++
题目描述游戏里面,队伍通过匹配实力相近的对手进行对战。但是如果匹配的队伍实力相差太大,对于双方游戏体验都不会太好。给定n个队伍的实力值,对其进行两两实力匹配,两支队伍实例差距在允许的最大差距d内,则可以匹配。要求在匹配队伍最多的情况下匹配出的各组实力差距的总和最小。输入描述第一行,n,d。队伍个数n。允许的最大实力差距d。2<=n<=500<=d<=100第二行,n个队伍的实力值空格分割。0<=各
复习JVM
LMQ6
jvm
JVM的三个主要主题:1.java内存区域划分:a.堆b.栈c.元数据区d.程序计数器2.类加载a.加载:打开.class文件,读取内容b.验证:验证.class文件的格式是否符合要求.c.准备:给类对象分配内存空间d.解析:初始化字符串常量e.初始化:对类对象中的各个部分初始化,比如静态代码块,静态成员的初始化等经典面试题:双亲委派模型他出现在"加载"环节,根据"全限定名称"寻找对应的.clas
揭秘Java内存模型:那些让人头疼的可见性问题--JVM基础(15)
guangzhi0633
java jvm 开发语言
一、揭秘Java内存模型:那些让人头疼的可见性问题在Java的世界里,多线程编程如同一场精彩的魔术表演,但稍有不慎,就可能陷入“内存可见性”这个魔术黑洞。今天,就让我们一起揭开Java内存模型的神秘面纱,探讨那些让人头疼的可见性问题!可见性问题的本质可见性问题,简单来说,就是当一个线程修改了共享变量的值后,其他线程却无法立即看到这个变化。这就像是你在房间里悄悄换了件衣服,但别人却看不到你的新装。现
JavaScript基础-API 和 Web API
難釋懷
前端 javascript 开发语言
在现代Web开发中,API(应用程序接口)是连接不同软件组件或系统之间的桥梁。对于前端开发者来说,JavaScript与WebAPI的结合使用尤为重要,它使得我们可以访问浏览器提供的各种功能和服务,从而构建出交互性更强、用户体验更好的网页应用。本文将介绍API的基本概念,重点探讨WebAPI及其在JavaScript中的应用。一、什么是API?API全称为“ApplicationProgrammi
HBase安装
lianhedaxue
Hadoop hbase
HBase安装本章将介绍如何安装HBase和初始配置。需要用Java和Hadoop来处理HBase,所以必须下载java和Hadoop并安装系统中。安装前设置安装Hadoop在Linux环境下之前,需要建立和使用LinuxSSH(安全Shell)。按照下面设立Linux环境提供的步骤。创建一个用户首先,建议从Unix创建一个单独的Hadoop用户,文件系统隔离Hadoop文件系统。按照下面给出创建
关于Go那些懒得看又不得不知道的东西
Hock2024
golang 开发语言 后端
写在前面当开始学习go,亦或是cpp、还是java向go进行转职,这部分内容都是比较重要的。go的编译环境,模块管理以及一些基本的语法我认为还是很有必要去学习的,因此重新学习了这个部分并且写下下面的学习笔记!如果有写错或者不全面的地方,还希望大家及时纠正和指导。连接环境首先,作为一个后端er,能使用linux系统是必备的技能,这里我建议可以使用Xshell连接云服务器的方案来完成。云服务器建议使用
HBase的架构介绍,安装及简单操作
pk_xz123456
大数据 hbase 架构 数据库
一、HBase安装1.环境准备Java环境:确保系统中已经安装了Java8或更高版本。可以通过在命令行中输入java-version来检查Java版本。Hadoop环境:HBase依赖于Hadoop,需要先安装并配置好Hadoop集群。确保Hadoop的相关服务(如HDFS、YARN等)已经正常启动。2.下载HBase从HBase官方网站(https://hbase.apache.org/)下载适
Vue相关面试题
努力的搬砖人.
vue.js
以下是150道Vue相关面试题及详细答案:Vue基础1.Vue.js是什么?Vue.js是一个用于构建用户界面的渐进式JavaScript框架,专注于视图层,允许开发者以声明式的方式构建用户界面,具有轻量、高效、易上手等特点。2.Vue实例的作用是什么?Vue实例是应用程序的核心,它管理数据、方法、生命周期钩子等,通过数据双向绑定将数据与视图层连接起来,实现数据驱动视图。3.如何创建一个Vue实例
【概念】Node.js,Express.js MongoDB Mongoose Express-Validator Async Handler
一袋米扛几楼98
各类概念 node.js express javascript
1.Node.js定义:Node.js是一个基于ChromeV8引擎的JavaScript运行时环境,允许你在服务器端运行JavaScript代码。作用:它使得开发者可以使用JavaScript编写服务器端代码,从而实现前后端使用同一种语言。比喻:Node.js就像是“工厂的电力系统”,它为整个工厂(应用程序)提供动力(运行环境)。没有电力系统,工厂的机器(代码)就无法运转。特点:非阻塞I/O:N
CAD二次开发之图纸特性字段AcDbDatabaseSummaryInfo
我的sun&shine
CAD二次开发 开发语言 c++
一、CAD接口类AcDbDatabaseSummaryInfo接口函数acdbGetSummaryInfo(pDb,pSum);addCustomSummaryInfo(key,value);acdbPutSummaryInfo(pSum);二、使用方法1.实现功能:在一张图纸中定义好字段,插入到另外一张图中,对应的字段会更新值。原图纸需要将对应位置写入字段的表达式例如%%%%%%%%新图纸在创建
Spring Boot详解
这河里吗l
SpringBoot spring boot 后端 java spring
目录1.SpringBoot介绍1.1什么是SpringBoot1.2SpringBoot特点1.3Javaweb、spring、springmvc和springboot有什么区别?1.4SpringBoot的Starter2.SpringBoot入门HelloWorld3.SpringBoot的全局配置文件3.1properties配置文件3.2yml配置文件3.3yml与properties的
SNMP协议以及JAVA实战代码展示
potato_h
java
SNMP协议以及代码实现主要是为了实现:Java通过SNMP协议和交换机进行交互JAVA开发SNMP明细第一步:(1)首先安装SNMP服务。(控制面板→添加与删除工具→添加与删除组件→管理和监视工具→详细信息→选择“简单网络管理协议”→确定)。(2)启动snmp服务。(3)下载snmp4j.jar(4)新建项目,加如snmp4j.jar,编写代码编写的代码中需要的内容:(1)枚举网元类型(目前只有
JavaScript基础-DOM事件流
難釋懷
javascript 开发语言
在Web开发过程中,理解和掌握DOM事件流是实现高效交互的关键。DOM事件流描述了当一个事件发生时,它在文档树中的传播路径。了解事件流的概念有助于我们更精确地控制事件处理逻辑,避免不必要的行为,并提升用户体验。本文将深入探讨DOM事件流的基本概念,包括事件捕获、目标阶段和事件冒泡,并通过示例展示如何应用这些知识。一、什么是DOM事件流?DOM事件流是指事件在整个页面结构中传播的过程。根据W3C标准
位图思想详解:用一个小小的比特征服整个世界
Joseit
优选算法 java 算法
位图思想详解:用一个小小的比特征服整个世界一、什么是位图?二、位图的形象理解三、位图的Java实现四、位图的算法原理剖析五、实际应用案例:网站用户活跃度统计五、真实的应用场景:布隆过滤器的基础六、算法题:判断字符是否唯一(easy)一、什么是位图?位图是一种超级节省空间的数据结构,他利用二进制位(0/1)来表示某个元素是否存在或某种状态是否为真。想象一下,用一个小小的比特位就能记录一个信息,这简直
springboot使用kafka自定义JSON序列化器和反序列化器
zhou_zhao_xu
Kafka spring
1.序列化器packagecom.springboot.kafkademo.serialization;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;importorg.apache.kafka.common.serialization.Serializer;importjava.util.Map;/**
数据采集高并发的架构应用
3golden
.net
问题的出发点:
最近公司为了发展需要,要扩大对用户的信息采集,每个用户的采集量估计约2W。如果用户量增加的话,将会大量照成采集量成3W倍的增长,但是又要满足日常业务需要,特别是指令要及时得到响应的频率次数远大于预期。
&n
不停止 MySQL 服务增加从库的两种方式
brotherlamp
linux linux视频 linux资料 linux教程 linux自学
现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库。前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作。
一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长。另一种是通过xtrabacku
Quartz——SimpleTrigger触发器
eksliang
SimpleTrigger TriggerUtils quartz
转载请出自出处:http://eksliang.iteye.com/blog/2208166 一.概述
SimpleTrigger触发器,当且仅需触发一次或者以固定时间间隔周期触发执行;
二.SimpleTrigger的构造函数
SimpleTrigger(String name, String group):通过该构造函数指定Trigger所属组和名称;
Simpl
Informatica应用(1)
18289753290
sql workflow lookup 组件 Informatica
1.如果要在workflow中调用shell脚本有一个command组件,在里面设置shell的路径;调度wf可以右键出现schedule,现在用的是HP的tidal调度wf的执行。
2.designer里面的router类似于SSIS中的broadcast(多播组件);Reset_Workflow_Var:参数重置 (比如说我这个参数初始是1在workflow跑得过程中变成了3我要在结束时还要
python 获取图片验证码中文字
酷的飞上天空
python
根据现成的开源项目 http://code.google.com/p/pytesser/改写
在window上用easy_install安装不上 看了下源码发现代码很少 于是就想自己改写一下
添加支持网络图片的直接解析
#coding:utf-8
#import sys
#reload(sys)
#sys.s
AJAX
永夜-极光
Ajax
1.AJAX功能:动态更新页面,减少流量消耗,减轻服务器负担
2.代码结构:
<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
.... AJAX script goes here ...
创业OR读研
随便小屋
创业
现在研一,有种想创业的想法,不知道该不该去实施。因为对于的我情况这两者是矛盾的,可能就是鱼与熊掌不能兼得。
研一的生活刚刚过去两个月,我们学校主要的是
需求做得好与坏直接关系着程序员生活质量
aijuans
IT 生活
这个故事还得从去年换工作的事情说起,由于自己不太喜欢第一家公司的环境我选择了换一份工作。去年九月份我入职现在的这家公司,专门从事金融业内软件的开发。十一月份我们整个项目组前往北京做现场开发,从此苦逼的日子开始了。
系统背景:五月份就有同事前往甲方了解需求一直到6月份,后续几个月也完
如何定义和区分高级软件开发工程师
aoyouzi
在软件开发领域,高级开发工程师通常是指那些编写代码超过 3 年的人。这些人可能会被放到领导的位置,但经常会产生非常糟糕的结果。Matt Briggs 是一名高级开发工程师兼 Scrum 管理员。他认为,单纯使用年限来划分开发人员存在问题,两个同样具有 10 年开发经验的开发人员可能大不相同。近日,他发表了一篇博文,根据开发者所能发挥的作用划分软件开发工程师的成长阶段。
初
Servlet的请求与响应
百合不是茶
servlet get提交 java处理post提交
Servlet是tomcat中的一个重要组成,也是负责客户端和服务端的中介
1,Http的请求方式(get ,post);
客户端的请求一般都会都是Servlet来接受的,在接收之前怎么来确定是那种方式提交的,以及如何反馈,Servlet中有相应的方法, http的get方式 servlet就是都doGet(
web.xml配置详解之listener
bijian1013
java web.xml listener
一.定义
<listener>
<listen-class>com.myapp.MyListener</listen-class>
</listener>
二.作用 该元素用来注册一个监听器类。可以收到事件什么时候发生以及用什么作为响
Web页面性能优化(yahoo技术)
Bill_chen
JavaScript Ajax Web css Yahoo
1.尽可能的减少HTTP请求数 content
2.使用CDN server
3.添加Expires头(或者 Cache-control) server
4.Gzip 组件 server
5.把CSS样式放在页面的上方。 css
6.将脚本放在底部(包括内联的) javascript
7.避免在CSS中使用Expressions css
8.将javascript和css独立成外部文
【MongoDB学习笔记八】MongoDB游标、分页查询、查询结果排序
bit1129
mongodb
游标
游标,简单的说就是一个查询结果的指针。游标作为数据库的一个对象,使用它是包括
声明
打开
循环抓去一定数目的文档直到结果集中的所有文档已经抓取完
关闭游标
游标的基本用法,类似于JDBC的ResultSet(hasNext判断是否抓去完,next移动游标到下一条文档),在获取一个文档集时,可以提供一个类似JDBC的FetchSize
ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
白糖_
ORA-12514
今天通过Oracle SQL*Plus连接远端服务器的时候提示“监听程序当前无法识别连接描述符中请求服务”,遂在网上找到了解决方案:
①打开Oracle服务器安装目录\NETWORK\ADMIN\listener.ora文件,你会看到如下信息:
# listener.ora Network Configuration File: D:\database\Oracle\net
Eclipse 问题 A resource exists with a different case
bozch
eclipse
在使用Eclipse进行开发的时候,出现了如下的问题:
Description Resource Path Location TypeThe project was not built due to "A resource exists with a different case: '/SeenTaoImp_zhV2/bin/seentao'.&
编程之美-小飞的电梯调度算法
bylijinnan
编程之美
public class AptElevator {
/**
* 编程之美 小飞 电梯调度算法
* 在繁忙的时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。
* 所有乘客都从一楼上电梯,到达某层楼后,电梯听下来,所有乘客再从这里爬楼梯到自己的目的层。
* 在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
* 问:电梯停在哪
SQL注入相关概念
chenbowen00
sql Web 安全
SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
首先让我们了解什么时候可能发生SQ
[光与电]光子信号战防御原理
comsci
原理
无论是在战场上,还是在后方,敌人都有可能用光子信号对人体进行控制和攻击,那么采取什么样的防御方法,最简单,最有效呢?
我们这里有几个山寨的办法,可能有些作用,大家如果有兴趣可以去实验一下
根据光
oracle 11g新特性:Pending Statistics
daizj
oracle dbms_stats
oracle 11g新特性:Pending Statistics 转
从11g开始,表与索引的统计信息收集完毕后,可以选择收集的统信息立即发布,也可以选择使新收集的统计信息处于pending状态,待确定处于pending状态的统计信息是安全的,再使处于pending状态的统计信息发布,这样就会避免一些因为收集统计信息立即发布而导致SQL执行计划走错的灾难。
在 11g 之前的版本中,D
快速理解RequireJs
dengkane
jquery requirejs
RequireJs已经流行很久了,我们在项目中也打算使用它。它提供了以下功能:
声明不同js文件之间的依赖
可以按需、并行、延时载入js库
可以让我们的代码以模块化的方式组织
初看起来并不复杂。 在html中引入requirejs
在HTML中,添加这样的 <script> 标签:
<script src="/path/to
C语言学习四流程控制if条件选择、for循环和强制类型转换
dcj3sjt126com
c
# include <stdio.h>
int main(void)
{
int i, j;
scanf("%d %d", &i, &j);
if (i > j)
printf("i大于j\n");
else
printf("i小于j\n");
retu
dictionary的使用要注意
dcj3sjt126com
IO
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
user.user_id , @"id",
user.username , @"username",
Android 中的资源访问(Resource)
finally_m
xml android String drawable color
简单的说,Android中的资源是指非代码部分。例如,在我们的Android程序中要使用一些图片来设置界面,要使用一些音频文件来设置铃声,要使用一些动画来显示特效,要使用一些字符串来显示提示信息。那么,这些图片、音频、动画和字符串等叫做Android中的资源文件。
在Eclipse创建的工程中,我们可以看到res和assets两个文件夹,是用来保存资源文件的,在assets中保存的一般是原生
Spring使用Cache、整合Ehcache
234390216
spring cache ehcache @Cacheable
Spring使用Cache
从3.1开始,Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的
当druid遇上oracle blob(clob)
jackyrong
oracle
http://blog.csdn.net/renfufei/article/details/44887371
众所周知,Oracle有很多坑, 所以才有了去IOE。
在使用Druid做数据库连接池后,其实偶尔也会碰到小坑,这就是使用开源项目所必须去填平的。【如果使用不开源的产品,那就不是坑,而是陷阱了,你都不知道怎么去填坑】
用Druid连接池,通过JDBC往Oracle数据库的
easyui datagrid pagination获得分页页码、总页数等信息
ldzyz007
var grid = $('#datagrid');
var options = grid.datagrid('getPager').data("pagination").options;
var curr = options.pageNumber;
var total = options.total;
var max =
浅析awk里的数组
nigelzeng
二维数组 array 数组 awk
awk绝对是文本处理中的神器,它本身也是一门编程语言,还有许多功能本人没有使用到。这篇文章就单单针对awk里的数组来进行讨论,如何利用数组来帮助完成文本分析。
有这么一组数据:
abcd,91#31#2012-12-31 11:24:00
case_a,136#19#2012-12-31 11:24:00
case_a,136#23#2012-12-31 1
搭建 CentOS 6 服务器(6) - TigerVNC
rensanning
centos
安装GNOME桌面环境
# yum groupinstall "X Window System" "Desktop"
安装TigerVNC
# yum -y install tigervnc-server tigervnc
启动VNC服务
# /etc/init.d/vncserver restart
# vncser
Spring 数据库连接整理
tomcat_oracle
spring bean jdbc
1、数据库连接jdbc.properties配置详解 jdbc.url=jdbc:hsqldb:hsql://localhost/xdb jdbc.username=sa jdbc.password= jdbc.driver=不同的数据库厂商驱动,此处不一一列举 接下来,详细配置代码如下:
Spring连接池  
Dom4J解析使用xpath java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常
xp9802
用Dom4J解析xml,以前没注意,今天使用dom4j包解析xml时在xpath使用处报错
异常栈:java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常
导入包 jaxen-1.1-beta-6.jar 解决;
&nb