[文档] TDDL和Diamond的使用(三):TDDL
2016-04-27 16:37
330 查看
一,编译
TDDL依赖于Diamond,在Diamond部署完毕后,可以试用TDDL。
1.
获取代码:直接co最新的代码即可(version: r14)。
2.
配置修改:TDDL的代码仍旧是GBK编码,首先需要检查pom.xml并加入编码配置,否则在linux下编译会出现解码错误:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<encoding>GBK</encoding>
</configuration>
</plugin>
复制代码
项目编译依赖ojdbc14,但是mvn中该jar包已经挂了,需要删除根目录及tbdatasource、tddl-atom-datasource子目录下pom.xml中的ojdbc14配置
3.
依赖包的安装:
tddl-common模块包中的类中会调用diamond项目的类,需要将diamond-client*.jar和diamond-utils*.jar安装入mvn本地库:
mvn install:install-file -DgroupId=com.taobao.diamond -DartifactId=diamond-client -Dversion=2.0.5.3.taocode-SNAPSHOT -Dpackaging=jar -Dfile=/path/to/file
复制代码
按照编译出错提示操作即可。
4.
编译
使用mvn clean package -Dmaven.test.skip编译之,得到如下结果:
[INFO] taobao distributed data layer v3.0.1.5.taobaocode-SNAPSHOT SUCCESS [2.253s]
[INFO] tddl-interact v3.0.1.5.taobaocode-SNAPSHOT ………… SUCCESS [3.319s]
[INFO] tbdatasource v3.0.1.5.taobaocode-SNAPSHOT …………. SUCCESS [5.939s]
[INFO] tddl-common v3.0.1.5.taobaocode-SNAPSHOT ………….. SUCCESS [4.532s]
[INFO] tddl-atom-datasource v3.0.1.5.taobaocode-SNAPSHOT ….. SUCCESS [4.313s]
[INFO] tddl-group-datasource v3.0.1.5.taobaocode-SNAPSHOT …. SUCCESS [3.627s]
[INFO] tddl-sample v3.0.1.5.taobaocode-SNAPSHOT ………….. SUCCESS [1.040s]
下面就可以使用了。
二,示例
TDDL动态数据源的基本说明请先阅读见http://jm-blog.aliapp.com/?p=1642。
TAtomDataSource用于配置单个数据源;而TGroupDataSource用于配置集群。下面使用代码进行简单测试,代码的编译和运行依赖log4j, spring3.1.1,
apache commons等请自行下载或从maven本地库中提取。
4.2.1
TAtomDataSource
1.
设置数据库
drop database if exists qatest_normal_0;
CREATE DATABASE `qatest_normal_0`
CREATE USER ’tddl’@'%’ IDENTIFIED BY ’tddl’;
GRANT ALL ON qatest_normal_0.* TO ’tddl’@'%’;
CREATE TABLE `normaltbl_0001` (
`pk` int(11) NOT NULL,
`id` int(11) DEFAULT NULL,
`gmt_create` date DEFAULT '2010-12-17',
`name` varchar(30) DEFAULT NULL,
`floatCol` float(9,3) DEFAULT '0.000',
PRIMARY KEY (`pk`)
) ENGINE=InnoDB DEFAULT CHARSET=GBK
复制代码
上表中创建了一个数据库qatest_normal_0并且创建表normaltbl_0001用于存放数据。
2.
配置数据源
将上一步的数据源配置到diamond中,需要加入Global,App和User三种配置
a) Global配置:配置数据源地址
dataId:com.taobao.tddl.atom.global.qatest_normal_0
group:DEFAULT_GROUP
content:
ip=127.0.0.1
port=3306
dbName=qatest_normal_0
dbType=mysql
dbStatus=RW
复制代码
b) App配置:配置连接池
dataId:com.taobao.tddl.atom.app.tddl_sample.qatest_normal_0
group:DEFAULT_GROUP
content:
userName=tddl
minPoolSize=1
maxPoolSize=2
idleTimeout=10
blockingTimeout=5
preparedStatementCacheSize=15
connectionProperties=characterEncoding=gbk
复制代码
c) User配置:配置访问密码
dataId:com.taobao.tddl.atom.passwd.qatest_normal_0.mysql.tddl
group:DEFAULT_GROUP
content:
encPasswd=5a826c8121945c969bf9844437e00e28
复制代码
注意此处的encPasswd为密码(tddl)的密文,使用JbossPasswordDecode来加密之。
3.
代码
由于需要连接diamond获取信息,因此在测试机上需要配置a.b.c域名
测试代码如下:通过TAtomDataSource进行插入和查找
protected static final String APPNAME = "tddl_sample";
protected static final String DBKEY_0 = "qatest_normal_0";
protected static final int RANDOM_ID = Integer.valueOf(RandomStringUtils.randomNumeric(8));
protected static String time = DateUtil.formatDate(new Date(),
DateUtil.DATE_FULLHYPHEN);
static void testAtomDataSource() throws Exception {
TAtomDataSource tds = new TAtomDataSource();
tds.setAppName(APPNAME);
tds.setDbKey(DBKEY_0);
tds.init();
JdbcTemplate tddlJT = new JdbcTemplate(tds);
String sql = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)";
Object[] arguments = new Object[] { RANDOM_ID, time };
int n = tddlJT.update(sql, arguments);
System.out.println("update n:" + n);
Map re = tddlJT.queryForMap("select * from normaltbl_0001 where pk=?",
new Object[] { RANDOM_ID });
System.out.println(String.valueOf(re.get("gmt_create")));
tds.destroyDataSource();
}
复制代码
运行代码,可以发现数据库中已经插入了新的数据。
4.2.2
TGroupDataSource
TGroupDataSource用于集群管理,因此为4.2.1中的数据源创建一个镜像数据源形成互备(注意:TDDL不负责数据源之间的数据同步,数据同步需要管理员处理);然后在这两个数据源之间进行访问切换。两个数据源可以在不同的机器上,示例中使用同一台机器。
1.
设置数据库
drop database if exists qatest_normal_0_bak;
CREATE DATABASE `qatest_normal_0_bak`
CREATE USER ’tddl’@'%’ IDENTIFIED BY ’tddl’;
GRANT ALL ON qatest_normal_0_bak.* TO ’tddl’@'%’;
CREATE TABLE `normaltbl_0001` (
`pk` int(11) NOT NULL,
`id` int(11) DEFAULT NULL,
`gmt_create` date DEFAULT '2010-12-17',
`name` varchar(30) DEFAULT NULL,
`floatCol` float(9,3) DEFAULT '0.000',
PRIMARY KEY (`pk`)
) ENGINE=InnoDB DEFAULT CHARSET=GBK
复制代码
上图中创建了qatest_normal_0_bak库,设置同qatest_normal_0
2.
配置数据源
在4.2.1同已经配置了qatest_normal_0的数据源,下面只需要配置集群信息和qatest_normal_0_bak信息即可。
a) qatest_normal_0_bak的Global配置:配置数据源地址
dataId:com.taobao.tddl.atom.global.qatest_normal_0_bak
group:DEFAULT_GROUP
content:
ip=127.0.0.1
port=3306
dbName=qatest_normal_0_bak
dbType=mysql
dbStatus=RW
复制代码
b) qatest_normal_0_bak的App配置:配置连接池
dataId:com.taobao.tddl.atom.app.tddl_sample.qatest_normal_0_bak
group:DEFAULT_GROUP
content:
userName=tddl
minPoolSize=1
maxPoolSize=2
idleTimeout=10
blockingTimeout=5
preparedStatementCacheSize=15
connectionProperties=characterEncoding=gbk
复制代码
c) qatest_normal_0_bak的User配置:配置访问密码
dataId:com.taobao.tddl.atom.passwd.qatest_normal_0_bak.mysql.tddl
group:DEFAULT_GROUP
content:
encPasswd=5a826c8121945c969bf9844437e00e28
复制代码
d) 集群信息:两个数据源的访问配置
dataId:com.taobao.tddl.jdbc.group_V2.4.1_group_sample
group:DEFAULT_GROUP
content:
qatest_normal_0:r10w10,qatest_normal_0_bak:r10w0
复制代码
这里的content设置了两个数据源的读写权重,qatest_normal_0为读写(r10w10),qatest_normal_0_bak为只读不写(r10w0),r/w后的数字代表权重。
对于任何一个数据源,权重配置模式为(具体可见com.taobao.tddl.jdbc.group.config。Wight.java):[r|R](\\d*) [w|W](\\d*)
[p|P](\\d*) [q|Q](\\d*) [i|I](\\d*)
字母r或R表示可以对数据库进行读操作, 后面跟一个数字表示读操作的权重,如果字母r或R后面没有数字,则默认是10;
字母w或W表示可以对数据库进行写操作, 后面跟一个数字表示写操作的权重,如果字母w或W后面没有数字,则默认是10;
字母p或P表示读操作的优先级, 数字越大优先级越高,读操作优先从优先级最高的数据库中读数据, * 如果字母p或P后面没有数字,则默认优先级是0;
字母q或Q表示写操作的优先级, 数字越大优先级越高,写操作优先从优先级最高的数据库中写数据,如果字母q或Q后面没有数字,则默认优先级是0.
字母i或I表示动态DBIndex, 和用户通过threadLocal指定的dbIndex结合,实现rw之上更灵活的路由:一个db可以同时配置多个i;不同的db可以配置相同的i,例如
db0:i0i2,db1:i1,db2:i1,db3:i2则
*用户指定dbIndex=0,路由到db0;(只有db0有i0)
*用户指定dbIndex=1,随机路由到db1和db2;(db1和db2都有i1)
*用户指定dbIndex=2,随机路由到db0和db3;(db0和db3都有i2)
3.
测试代码
测试同4.2.1,配置a.b.c域名和引入相关jar包后:
protected static final String APPNAME = "tddl_sample";
protected static final String DBKEY_0 = "qatest_normal_0";
protected static final int RANDOM_ID = Integer.valueOf(RandomStringUtils.randomNumeric(8));
protected static String time = DateUtil.formatDate(new Date(),
DateUtil.DATE_FULLHYPHEN);
protected static final String GROUP_KEY = "group_sample";
static void testGroupDs() throws Exception {
TGroupDataSource tds = new TGroupDataSource();
tds.setAppName(APPNAME);
tds.setDbGroupKey(GROUP_KEY);
tds.init();
JdbcTemplate tddlJT = new JdbcTemplate(tds);
for (int i = 0; i < 100; i++) {
int rID = (int) (System.currentTimeMillis() - 1383000000000L);
String sql = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)";
Object[] arguments = new Object[] { rID, time };
tddlJT.update(sql, arguments);
Thread.sleep(5000);
}
}
复制代码
这段代码会根据diamond的配置来写数据:每隔5秒循环写一条数据,在循环期间如果对diamond的设置做了修改,如修改qatest_normal_0_bak为写库而 qatest_normal_0为只读,可以看到TDDL会自动根据配置变化写到不同的库里去。
扩展阅读:
TDDL和Diamond的使用(一):基本介绍:http://udn.yyuap.com/thread-38155-1-1.html
TDDL和Diamond的使用(二):Diamond:http://udn.yyuap.com/thread-38157-1-1.html
TDDL和Diamond的使用(三):TDDL:http://udn.yyuap.com/thread-38159-1-1.html
TDDL依赖于Diamond,在Diamond部署完毕后,可以试用TDDL。
1.
获取代码:直接co最新的代码即可(version: r14)。
2.
配置修改:TDDL的代码仍旧是GBK编码,首先需要检查pom.xml并加入编码配置,否则在linux下编译会出现解码错误:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<encoding>GBK</encoding>
</configuration>
</plugin>
复制代码
项目编译依赖ojdbc14,但是mvn中该jar包已经挂了,需要删除根目录及tbdatasource、tddl-atom-datasource子目录下pom.xml中的ojdbc14配置
3.
依赖包的安装:
tddl-common模块包中的类中会调用diamond项目的类,需要将diamond-client*.jar和diamond-utils*.jar安装入mvn本地库:
mvn install:install-file -DgroupId=com.taobao.diamond -DartifactId=diamond-client -Dversion=2.0.5.3.taocode-SNAPSHOT -Dpackaging=jar -Dfile=/path/to/file
复制代码
按照编译出错提示操作即可。
4.
编译
使用mvn clean package -Dmaven.test.skip编译之,得到如下结果:
[INFO] taobao distributed data layer v3.0.1.5.taobaocode-SNAPSHOT SUCCESS [2.253s]
[INFO] tddl-interact v3.0.1.5.taobaocode-SNAPSHOT ………… SUCCESS [3.319s]
[INFO] tbdatasource v3.0.1.5.taobaocode-SNAPSHOT …………. SUCCESS [5.939s]
[INFO] tddl-common v3.0.1.5.taobaocode-SNAPSHOT ………….. SUCCESS [4.532s]
[INFO] tddl-atom-datasource v3.0.1.5.taobaocode-SNAPSHOT ….. SUCCESS [4.313s]
[INFO] tddl-group-datasource v3.0.1.5.taobaocode-SNAPSHOT …. SUCCESS [3.627s]
[INFO] tddl-sample v3.0.1.5.taobaocode-SNAPSHOT ………….. SUCCESS [1.040s]
下面就可以使用了。
二,示例
TDDL动态数据源的基本说明请先阅读见http://jm-blog.aliapp.com/?p=1642。
TAtomDataSource用于配置单个数据源;而TGroupDataSource用于配置集群。下面使用代码进行简单测试,代码的编译和运行依赖log4j, spring3.1.1,
apache commons等请自行下载或从maven本地库中提取。
4.2.1
TAtomDataSource
1.
设置数据库
drop database if exists qatest_normal_0;
CREATE DATABASE `qatest_normal_0`
CREATE USER ’tddl’@'%’ IDENTIFIED BY ’tddl’;
GRANT ALL ON qatest_normal_0.* TO ’tddl’@'%’;
CREATE TABLE `normaltbl_0001` (
`pk` int(11) NOT NULL,
`id` int(11) DEFAULT NULL,
`gmt_create` date DEFAULT '2010-12-17',
`name` varchar(30) DEFAULT NULL,
`floatCol` float(9,3) DEFAULT '0.000',
PRIMARY KEY (`pk`)
) ENGINE=InnoDB DEFAULT CHARSET=GBK
复制代码
上表中创建了一个数据库qatest_normal_0并且创建表normaltbl_0001用于存放数据。
2.
配置数据源
将上一步的数据源配置到diamond中,需要加入Global,App和User三种配置
a) Global配置:配置数据源地址
dataId:com.taobao.tddl.atom.global.qatest_normal_0
group:DEFAULT_GROUP
content:
ip=127.0.0.1
port=3306
dbName=qatest_normal_0
dbType=mysql
dbStatus=RW
复制代码
b) App配置:配置连接池
dataId:com.taobao.tddl.atom.app.tddl_sample.qatest_normal_0
group:DEFAULT_GROUP
content:
userName=tddl
minPoolSize=1
maxPoolSize=2
idleTimeout=10
blockingTimeout=5
preparedStatementCacheSize=15
connectionProperties=characterEncoding=gbk
复制代码
c) User配置:配置访问密码
dataId:com.taobao.tddl.atom.passwd.qatest_normal_0.mysql.tddl
group:DEFAULT_GROUP
content:
encPasswd=5a826c8121945c969bf9844437e00e28
复制代码
注意此处的encPasswd为密码(tddl)的密文,使用JbossPasswordDecode来加密之。
3.
代码
由于需要连接diamond获取信息,因此在测试机上需要配置a.b.c域名
测试代码如下:通过TAtomDataSource进行插入和查找
protected static final String APPNAME = "tddl_sample";
protected static final String DBKEY_0 = "qatest_normal_0";
protected static final int RANDOM_ID = Integer.valueOf(RandomStringUtils.randomNumeric(8));
protected static String time = DateUtil.formatDate(new Date(),
DateUtil.DATE_FULLHYPHEN);
static void testAtomDataSource() throws Exception {
TAtomDataSource tds = new TAtomDataSource();
tds.setAppName(APPNAME);
tds.setDbKey(DBKEY_0);
tds.init();
JdbcTemplate tddlJT = new JdbcTemplate(tds);
String sql = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)";
Object[] arguments = new Object[] { RANDOM_ID, time };
int n = tddlJT.update(sql, arguments);
System.out.println("update n:" + n);
Map re = tddlJT.queryForMap("select * from normaltbl_0001 where pk=?",
new Object[] { RANDOM_ID });
System.out.println(String.valueOf(re.get("gmt_create")));
tds.destroyDataSource();
}
复制代码
运行代码,可以发现数据库中已经插入了新的数据。
4.2.2
TGroupDataSource
TGroupDataSource用于集群管理,因此为4.2.1中的数据源创建一个镜像数据源形成互备(注意:TDDL不负责数据源之间的数据同步,数据同步需要管理员处理);然后在这两个数据源之间进行访问切换。两个数据源可以在不同的机器上,示例中使用同一台机器。
1.
设置数据库
drop database if exists qatest_normal_0_bak;
CREATE DATABASE `qatest_normal_0_bak`
CREATE USER ’tddl’@'%’ IDENTIFIED BY ’tddl’;
GRANT ALL ON qatest_normal_0_bak.* TO ’tddl’@'%’;
CREATE TABLE `normaltbl_0001` (
`pk` int(11) NOT NULL,
`id` int(11) DEFAULT NULL,
`gmt_create` date DEFAULT '2010-12-17',
`name` varchar(30) DEFAULT NULL,
`floatCol` float(9,3) DEFAULT '0.000',
PRIMARY KEY (`pk`)
) ENGINE=InnoDB DEFAULT CHARSET=GBK
复制代码
上图中创建了qatest_normal_0_bak库,设置同qatest_normal_0
2.
配置数据源
在4.2.1同已经配置了qatest_normal_0的数据源,下面只需要配置集群信息和qatest_normal_0_bak信息即可。
a) qatest_normal_0_bak的Global配置:配置数据源地址
dataId:com.taobao.tddl.atom.global.qatest_normal_0_bak
group:DEFAULT_GROUP
content:
ip=127.0.0.1
port=3306
dbName=qatest_normal_0_bak
dbType=mysql
dbStatus=RW
复制代码
b) qatest_normal_0_bak的App配置:配置连接池
dataId:com.taobao.tddl.atom.app.tddl_sample.qatest_normal_0_bak
group:DEFAULT_GROUP
content:
userName=tddl
minPoolSize=1
maxPoolSize=2
idleTimeout=10
blockingTimeout=5
preparedStatementCacheSize=15
connectionProperties=characterEncoding=gbk
复制代码
c) qatest_normal_0_bak的User配置:配置访问密码
dataId:com.taobao.tddl.atom.passwd.qatest_normal_0_bak.mysql.tddl
group:DEFAULT_GROUP
content:
encPasswd=5a826c8121945c969bf9844437e00e28
复制代码
d) 集群信息:两个数据源的访问配置
dataId:com.taobao.tddl.jdbc.group_V2.4.1_group_sample
group:DEFAULT_GROUP
content:
qatest_normal_0:r10w10,qatest_normal_0_bak:r10w0
复制代码
这里的content设置了两个数据源的读写权重,qatest_normal_0为读写(r10w10),qatest_normal_0_bak为只读不写(r10w0),r/w后的数字代表权重。
对于任何一个数据源,权重配置模式为(具体可见com.taobao.tddl.jdbc.group.config。Wight.java):[r|R](\\d*) [w|W](\\d*)
[p|P](\\d*) [q|Q](\\d*) [i|I](\\d*)
字母r或R表示可以对数据库进行读操作, 后面跟一个数字表示读操作的权重,如果字母r或R后面没有数字,则默认是10;
字母w或W表示可以对数据库进行写操作, 后面跟一个数字表示写操作的权重,如果字母w或W后面没有数字,则默认是10;
字母p或P表示读操作的优先级, 数字越大优先级越高,读操作优先从优先级最高的数据库中读数据, * 如果字母p或P后面没有数字,则默认优先级是0;
字母q或Q表示写操作的优先级, 数字越大优先级越高,写操作优先从优先级最高的数据库中写数据,如果字母q或Q后面没有数字,则默认优先级是0.
字母i或I表示动态DBIndex, 和用户通过threadLocal指定的dbIndex结合,实现rw之上更灵活的路由:一个db可以同时配置多个i;不同的db可以配置相同的i,例如
db0:i0i2,db1:i1,db2:i1,db3:i2则
*用户指定dbIndex=0,路由到db0;(只有db0有i0)
*用户指定dbIndex=1,随机路由到db1和db2;(db1和db2都有i1)
*用户指定dbIndex=2,随机路由到db0和db3;(db0和db3都有i2)
3.
测试代码
测试同4.2.1,配置a.b.c域名和引入相关jar包后:
protected static final String APPNAME = "tddl_sample";
protected static final String DBKEY_0 = "qatest_normal_0";
protected static final int RANDOM_ID = Integer.valueOf(RandomStringUtils.randomNumeric(8));
protected static String time = DateUtil.formatDate(new Date(),
DateUtil.DATE_FULLHYPHEN);
protected static final String GROUP_KEY = "group_sample";
static void testGroupDs() throws Exception {
TGroupDataSource tds = new TGroupDataSource();
tds.setAppName(APPNAME);
tds.setDbGroupKey(GROUP_KEY);
tds.init();
JdbcTemplate tddlJT = new JdbcTemplate(tds);
for (int i = 0; i < 100; i++) {
int rID = (int) (System.currentTimeMillis() - 1383000000000L);
String sql = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)";
Object[] arguments = new Object[] { rID, time };
tddlJT.update(sql, arguments);
Thread.sleep(5000);
}
}
复制代码
这段代码会根据diamond的配置来写数据:每隔5秒循环写一条数据,在循环期间如果对diamond的设置做了修改,如修改qatest_normal_0_bak为写库而 qatest_normal_0为只读,可以看到TDDL会自动根据配置变化写到不同的库里去。
扩展阅读:
TDDL和Diamond的使用(一):基本介绍:http://udn.yyuap.com/thread-38155-1-1.html
TDDL和Diamond的使用(二):Diamond:http://udn.yyuap.com/thread-38157-1-1.html
TDDL和Diamond的使用(三):TDDL:http://udn.yyuap.com/thread-38159-1-1.html
相关文章推荐
- 剑指offer:把数组排成最小的数
- 模拟UA实现访问只能在微信上打开的网页
- 设置Linux内核参数 /etc/sysctl.conf
- Python 正则表达式的简单使用示例
- C++实践参考:警察与厨师
- Java发送邮件代码
- git四步骤
- springMVC整合jedis+redis
- 2/3/4G下载频、小区、扇区的概念
- 【目标检测】Faster RCNN算法详解
- <deep learning>读书笔记(一)特征分解与坐标变换
- 秒杀优化总结点
- ajax删除确定框 (也可以用于其它确定框
- freebsd 10安装postgresql 9.44
- Loadrunner性能测试结果进行分析
- [文档] TDDL和Diamond的使用(二):Diamond
- webrtc.org本地浏览版[分享]
- Linux下Rsync+Inotify-tools实现数据实时同步
- UCM——统一配置文件管理
- Web前沿—HTML5 Form Data 对象的使用