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)
代码随想录算法训练营第52天 | 101.孤岛的总面积 、102.沉没孤岛、103.水流问题、104.建造最大岛屿
Amor_Fati_Yu
算法 java 数据结构
101.孤岛的总面积importjava.util.*;publicclassMain{privatestaticintcount=0;privatestaticfinalint[][]dir={{0,1},{1,0},{-1,0},{0,-1}};//四个方向privatestaticvoidbfs(int[][]grid,intx,inty){Queueque=newLinkedList=gr
将字符串数组String[]转换成List的三种方法
积极向上的Elbert
java学习 java 开发语言
通过Arrays.asList(strArray)方式,将数组转换List后,不能对List增删,只能查改,否则抛异常。String[]strArray=newString[2];Listlist=Arrays.asList(strArray);list.add("1");//此处会报错原因解析:Arrays.asList(strArray)返回值是java.util.Arrays类中一个私有静态
Java Fork/Join 框架详解
empti_
数据结构与算法 java
JavaFork/Join框架详解Fork/Join框架是Java7引入的一个并行编程框架,专门设计用来高效地实现分治算法(Divide-and-Conquer)。它通过工作窃取(Work-Stealing)算法来最大化多核处理器的利用率。一、核心概念1.基本组成ForkJoinPool:特殊的线程池,管理工作线程ForkJoinTask:表示任务的抽象类,有两个重要子类:RecursiveAct
Java注解的实现原理
empti_
Java基础 java
Java注解的实现原理Java注解的实现涉及Java语言规范、编译器处理和JVM支持等多个层面。下面我将详细解释注解在Java中的实现机制。一、注解的本质注解本质上是一种特殊的接口,所有注解类型都隐式继承自java.lang.annotation.Annotation接口。当你定义一个注解时:public@interfaceMyAnnotation{Stringvalue();}编译器实际上会生成
并行归并排序的 Java 实现
empti_
数据结构与算法 java 算法 排序算法
并行归并排序Java实现importjava.util.concurrent.RecursiveAction;importjava.util.concurrent.ForkJoinPool;publicclassParallelMergeSort{//主方法,供外部调用publicstaticvoidparallelMergeSort(int[]array){ForkJoinPoolpool=ne
Spring Boot项目初始化加载自定义配置文件内容到静态属性字段
@Corgi
Java面试题 spring boot 后端 java
文章目录创建配置文件cXXX.properties配置类XXXConfig.java添加第三方JAR包创建配置文件cXXX.properties在resource目录下新建配置文件cXXX.properties,内容如下:#商户号mch_id=xxxxx#商户密码pwd=xxxx#接口请求地址req_url=https://xxx#异步回调通知地址(请替换为实际地址)notify_url=htt
Nginx与Tomcat:谁更适合你的服务器?
当归1024
java 中间件 nginx nginx tomcat 服务器
nginx和Tomcat是两种不同类型的服务器软件,它们各有不同的用途和特点:基本定义nginx轻量级的HTTP服务器和反向代理服务器主要用于静态文件服务、负载均衡、反向代理TomcatJavaWeb应用服务器专门用于运行JavaWeb应用(JSP、Servlet)主要区别1.功能定位nginx:静态文件服务器反向代理服务器负载均衡器HTTP缓存服务器Tomcat:Java应用容器JSP/Serv
Spring AI Alibaba 支持国产大模型的Spring ai框架
程序员老陈头
面试 学习路线 阿里巴巴 spring 人工智能 java
总计30万奖金,SpringAIAlibaba应用框架挑战赛开赛点此了解SpringAI:java做ai应用的最好选择过去,Java在AI应用开发方面缺乏一个高效且易于集成的框架,这限制了开发者快速构建和部署智能应用程序的能力。SpringAI正是为解决这一问题而生,它提供了一套统一的接口,使得AI功能能够以一种标准化的方式被集成到现有的Java项目中。此外,SpringAI与原有的Spring生
Node.js 全局对象
froginwe11
开发语言
Node.js全局对象引言Node.js作为一种流行的JavaScript运行环境,以其高性能、轻量级和跨平台的特点,被广泛应用于服务器端编程、网络应用开发等领域。在Node.js中,全局对象是一个重要的概念,它为开发者提供了一系列内置的全局变量和方法,使得编程变得更加便捷。本文将详细介绍Node.js的全局对象,帮助开发者更好地理解和运用它们。Node.js全局对象概述Node.js的全局对象指
企业级AI开发利器:Spring AI框架深度解析与实战_spring ai实战
AI大模型-海文
人工智能 spring python 算法 开发语言 java 机器学习
企业级AI开发利器:SpringAI框架深度解析与实战一、前言:Java生态的AI新纪元在人工智能技术爆发式发展的今天,Java开发者面临着一个新的挑战:如何将大语言模型(LLMs)和生成式AI(GenAI)无缝融入企业级应用。传统的Java生态缺乏统一的AI集成方案,开发者往往需要为不同AI供应商(如OpenAI、阿里云、HuggingFace)编写大量重复的接口适配代码,这不仅增加了开发成本,
009 【入门】单双链表及其反转-堆栈诠释
要天天开心啊
算法专栏 算法 链表
链表与堆栈系统详解|[数据结构]-[中级]-[通用]一、基础概念与内存模型1.按值传递vs按引用传递|[Java]-[基础]-[内存]//[典型错误示例]-Java中的引用传递陷阱voidmodify(Nodenode){node=node.next;//[警告]错误!仅修改局部引用的指向,不影响原始链表}//[正确做法]-通过引用修改对象内部状态voidrealModify(Nodenode){
深度解析JavaScript 闭包
coding随想
JavaScript javascript 开发语言 ecmascript
深度解析JavaScript闭包引言:为什么闭包让人又爱又怕?在JavaScript的学习过程中,闭包(Closure)是一个绕不开的“坎”。很多开发者第一次接触闭包时,会感到一头雾水:“为什么函数能记住外部作用域的变量?”、“为什么闭包会导致内存泄漏?”。但另一方面,闭包又是JavaScript最强大的特性之一,它支撑着模块化开发、数据封装、异步编程等核心场景。本文将通过通俗的语言和生动的案例,
JavaScript中的函数柯里化(Currying):从概念到实战
coding随想
JavaScript javascript ecmascript 开发语言 前端
JavaScript中的函数柯里化(Currying):从概念到实战在JavaScript开发中,函数式编程(FunctionalProgramming)逐渐成为一种主流思想。而函数柯里化(Currying),正是这一思想中的核心技巧之一。它不仅能提升代码的复用性和灵活性,还能帮助我们构建更优雅、更模块化的解决方案。本文将带你从零开始,深入理解柯里化的原理、实现方式及实际应用场景。一、什么是函数柯
webpack和vite区别
PromptOnce
webpack 前端 node.js
一、Webpack1.概述Webpack是一个模块打包工具,它会递归地构建依赖关系图,并将所有模块打包成一个或多个bundle(包)。2.特点配置灵活:Webpack提供了高度可定制的配置文件,可以根据项目需求进行各种优化。生态系统丰富:Webpack拥有庞大的插件和加载器生态系统,可以处理各种资源类型(JavaScript、CSS、图片等)。支持代码拆分:通过代码拆分和懒加载,Webpack可以
javascript 动态画心加文字
das白
# javascript javascript 动态 心型线 文字
测试//铺满屏幕varwidth=document.documentElement.clientWidth;varheight=document.documentElement.clientHeight;document.getElementById("gycanvas").setAttribute("width",width);document.getElementById("gycanvas"
javascript 动态画心
das白
# javascript javascript 动态 心型线
测试canvas{background:lawngreen;//画布背景色}//铺满屏幕varwidth=document.documentElement.clientWidth;varheight=document.documentElement.clientHeight;document.getElementById("gycanvas").setAttribute("width",width
javascript 画心型线
测试canvas{background:lawngreen;//画布背景色}//铺满屏幕varwidth=document.documentElement.clientWidth;varheight=document.documentElement.clientHeight;document.getElementById("gycanvas").setAttribute("width",width
掌握Web3开发:从入门到精通
夲奋亻Jay
Web3 web3
掌握Web3开发是一个涉及多个步骤和学习阶段的过程。以下是一些关键的步骤和开发案例,以及它们在搜索结果中的索引编号:了解区块链基础:学习区块链的基本概念,如去中心化、加密技术、共识机制等[1]。学习智能合约:学习智能合约的工作原理和它们在区块链上的应用,特别是以太坊平台上的智能合约[1]。掌握Web3.js或Ethers.js:学习如何使用这些JavaScript库与智能合约交互、发送交易和监听事
JavaScript性能优化
lyh1344
javascript 性能优化 开发语言
JavaScript性能优化方法减少重绘和回流频繁操作DOM会导致浏览器反复计算布局,引发性能问题。使用documentFragment进行批量DOM操作,或通过classList一次性修改多个样式属性。缓存DOM查询结果,避免重复访问。事件委托利用事件冒泡机制,将事件监听器绑定到父元素而非多个子元素。减少内存占用,提升动态内容的事件处理效率。节流与防抖高频事件(如滚动、输入)通过节流(Throt
将图片的base64编码直接嵌入到html文件的css中
Kuo-Teng
软件开发实战 html css javascript
将图片的base64编码直接嵌入到html文件的css中1.背景2.将图片进行base64编码3.将图片的base64编码写入到css1.背景如果你需要在html中引入一张外部图片,你可能会这样做:如果你将引用的图片保存到本地,你可能会这样做:但是,如果网络延迟较高,或者在jar包中运行Java项目时无法根据路径顺利找到图片呢?那么,将图片的base64编码直接写入html文件便是最好的选择!2.
什么是Node.js,有什么特点
前端与小赵
node.js
Node.js简介Node.js是一个基于ChromeV8引擎的JavaScript运行时环境,由RyanDahl于2009年创建。Node.js允许开发者使用JavaScript编写服务器端应用程序,打破了JavaScript仅限于浏览器端的限制。Node.js的设计目标是提供一种简单、高效的方式来构建可伸缩的网络应用。Node.js的特点非阻塞I/O特点:Node.js使用事件驱动的非阻塞I/
Node.js到底是什么
浪裡遊
杂文 node.js php 开发语言 前端 javascript vue.js
我想像是npm、vite这些名词大家都很熟悉,对它们的作用也有大致印象,但是可能都像我一样不明白Node.js到底是什么,这里给大家带来一个简单介绍。Node.js详解:历史发展、生态构建与底层原理一、Node.js的起源与历史发展诞生背景2009年5月:Node.js由RyanDahl开发并首次发布。其核心目标是解决JavaScript仅限于浏览器端运行的局限性,通过ChromeV8引擎(Jav
【Html实现“心形日出”(附效果+源代码)】| JavaScript面试题:解释一下异步编程中的回调函数、Promise和Async/Await的概念。它们有什么区别?
追光者♂
html5 css3 心形日出 前端特效 JS面试题 Promise Async/Await
风会带走你曾经存在过的证明。——虞姬作者主页:追光者♂个人简介:[1]计算机专业硕士研究生[2]2023年城市之星领跑者TOP1(哈尔滨)[3]2022年度博客之星人工智能领域TOP4[4]阿里云社区特邀专家博主[5]CSDN-人工智能领域优质创作者无限进步,一起追光!!!
java毕业设计房产中介系统mybatis+源码+调试部署+系统+数据库+lw
兮兮科技
java mybatis 开发语言
java毕业设计房产中介系统mybatis+源码+调试部署+系统+数据库+lwjava毕业设计房产中介系统mybatis+源码+调试部署+系统+数据库+lw本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5.7/8.0源码地址
JavaSE -- 时间类的详细介绍(Date,LocalDate)
@Touper
Java学习笔记 java 开发语言
Date类构造方法newDate():当前系统日期和时间。newDate(long):给定的日期时间常用方法after(Date):判断当前日期对象是否在给定日期之后before(Date):判断当前日期对象是否在给定日期之前equals(Object):判断两日期是否相等compareTo(Date):比较两日期前后顺序,如果当前日期对象大于给定日期对象返回1,小于返回-1,等于返回0。Date
支持java8的kafka版本
兮动人
kafka 分布式 支持java8的kafka版本
文章目录1.Kafka支持Java8的版本范围2.官方建议与兼容性3.版本迁移建议4.关键时间点5.注意事项6.总结1.Kafka支持Java8的版本范围Kafka2.x和3.x版本:Kafka2.x和3.x版本(如2.8.0、3.0.0等)理论上支持Java8,但官方已逐步弃用对Java8的支持。Kafka3.0:官方在3.0版本中弃用Java8(但仍允许使用),并强烈建议升级到Java11或更
Java基础:流程控制语句:条件、循环和跳转
越重天
Java 基础入门教程 Java 宝藏 java 开发语言 java流程控制语句 零到一学Java
前言Java中的流程控制语句其实和C、C++一样,在Java中,流程控制会涉及到包括if-else、while、do-while、for、return、break以及选择语句switch。下面以此进行分析。流程控制语句,分为三大类:条件语句,循环语句和跳转语句,如下图所示:1.条件语句条件语句可根据不同的条件执行不同的语句。包括if条件语句与switch多分支语句。1.1if语句if语句
HTML中引入JavaScript的三种方式
北冥郇翔
javascript html 前端
在HTML中引入JavaScript主要有以下三种方式,每种方式都有其适用场景和注意事项:1.内嵌方式(在标签内直接编写代码)直接在HTML文件的或中使用标签编写JavaScript代码。特点:代码与HTML混合,适用于简单逻辑或快速测试。alert()等函数会阻塞HTML页面渲染(如引用[1]所示)。示例:window.alert("页面加载被阻塞!");//阻塞后续内容渲染2.外部引入方式(推
Java/Kotlin 主线程IO操作全方位监控指南(实战代码+性能优化)
时小雨
Android实战与技巧 android kotlin
本文涵盖从基础监控到高级诊断的全套解决方案,包含10+个可直接落地的代码示例一、为什么需要监控主线程IO?主线程IO阻塞会导致界面卡顿、响应延迟等严重问题。典型场景:文件读写阻塞UI渲染网络请求未使用异步线程数据库查询未优化日志输出同步阻塞二、代码级监控方案(Kotlin实现)1.装饰器模式监控流操作classMonitoredInputStream(privatevalorigin:InputS
org.apache.rocketmq.client.consumer.DefaultMQPushConsumer.setNamespaceV2(java.lang.String) not exist
nextera-void
java-rocketmq apache rocketmq
***************************APPLICATIONFAILEDTOSTART***************************Description:Anattemptwasmadetocallamethodthatdoesnotexist.Theattemptwasmadefromthefollowinglocation:org.apache.rocketmq.sp
数据采集高并发的架构应用
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