TDDL+DIAMOND的配置及使用(三):TDDL

TDDL依賴於Diamond,在Diamond部署完畢後,纔可以使用TDDL。
1. 獲取代碼:TDDL的svn地址爲:http://code.taobao.org/svn/jltddl/,直接check out最新的代碼即可(version: r14)。
2. 配置修改:TDDL的代碼是GBK編碼,首先需要檢查pom.xml並加入編碼配置,否則編譯之後會出現解碼錯誤:

  1. <plugin>                               
  2.   <artifactId>maven-compiler-plugin</artifactId>
  3.   <configuration>
  4.        <source>1.6</source>
  5.        <target>1.6</target>                                       
  6.        <encoding>GBK</encoding>
  7.   </configuration>
  8. </plugin>

編譯依賴ojdbc,但是mvn中該jar包已經掛了,需要刪除根目錄及tbdatasource、tddl-atom-datasource子目錄下pom.xml中的ojdbc配置

	<dependency>
		<groupId>com.oracle</groupId>
		<artifactId>ojdbc14</artifactId>
		<version>10.2.0.3.0</version>
		<scope>provided</scope>
	   </dependency>
刪除根目錄以及下述目錄(tddl-interact)下pom.xml文件中的一個插件內容(artifactId爲maven-surefire-plugin的插件,該插件用作單元測試,因此我們可以不需要該插件,如果可以自己查看相關單元測試的類,然後引入到自己的項目中進行測試)。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.3</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin>
tddl默認用的是spring2.5.6,跟所用spring3的項目結合十會產生衝突,如果您的項目是spring3的話,請修改依賴引入spring3。

 <dependency>
            <groupId>org.springframework</groupId>
             <artifactId>spring-jdbc</artifactId>
            <version>3.0.5.RELEASE</version>
        </dependency>

3. 依賴包的安裝:
tddl-common模塊包中的類中會調用diamond項目的類,需要將diamond-client*.jar和diamond-utils*.jar安裝入mvn本地庫:請在用戶目錄下放入Diamond-utils和Diamond-client的jar包,然後運行命令,path根據自己庫的位置進行替換,如果還不行,自行把jar包放入相應的本地庫中。

  1. 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. 編譯
使用命令行到trunk跟目錄使用mvn clean package -Dmaven.test.skip編譯後,得到如下結果(不建議用eclipse進行編譯):
[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導入eclipse,如圖所示

注:tddl使用的jdk爲1.6, 如果你的jdk爲1.7或1.8項目會報錯,此時不要慌,點開錯誤的類添加未實現的方法並實現即可。

tddl使用例子

在使用tddl之前請明確你要使用的數據庫,兩者創建數據庫不管是sql還是方式是完全不同的(mysql相對簡單),本示例中tddl使用mysql,oracle請把tddl-atom-datasource項目中的TAtomConstants類中的DEFAULT_ORACLE_CON_TYPE改爲 thin模式(默認爲oci),把TAtomConURLTools中的連接代碼方法

public static String getOracleConURL(String ip, String port, String sid, String conType) {
		String conUrl = null;
		if (checkPrams(ip, port, sid)) {
			if (TStringUtil.isBlank(conType)
					&& TAtomConstants.DEFAULT_ORACLE_CON_TYPE.equals(conType.toLowerCase().trim())) {
				conUrl = ORACLE_URL_OCI_FORMAT.format(new String[] { ip, port, sid });
			} else {
				conUrl = ORACLE_URL_THIN_FORMAT.format(new String[] { ip, port, sid });
			}
		}
		return conUrl;
	}

 TAtomDataSource例子

1. 設置數據庫

  1. drop database if exists qatest_normal_0;
  2. CREATE DATABASE `qatest_normal_0`
  3. CREATE USER ’tddl’@'%’ IDENTIFIED BY ’tddl’;
  4. GRANT ALL ON qatest_normal_0.* TO ’tddl’@'%’;
  5. CREATE TABLE `normaltbl_0001` (
  6.   `pk` int(11) NOT NULL,
  7.   `id` int(11) DEFAULT NULL,
  8.   `gmt_create` date DEFAULT '2010-12-17',
  9.   `name` varchar(30) DEFAULT NULL,
  10.   `floatCol` float(9,3) DEFAULT '0.000',
  11.   PRIMARY KEY (`pk`)
  12. ) ENGINE=InnoDB DEFAULT CHARSET=GBK

上表中創建了一個數據庫qatest_normal_0並且創建表normaltbl_0001用於存放數據。
2. 配置數據源
將上一步的數據源配置到diamond中,需要加入Global,App和User三種配置
a) Global配置:配置數據源地址 格式:com.taobao.tddl.atom.globe.
dbkey

  1. dataId:com.taobao.tddl.atom.global.qatest_normal_0
  2. group:DEFAULT_GROUP
  3. content:
  4. ip=127.0.0.1
  5. port=3306
  6. dbName=qatest_normal_0
  7. dbType=mysql
  8. dbStatus=RW

b) App配置:配置連接池 格式:com.taobao.tddl.atom.app.appname.dbkey

  1. dataId:com.taobao.tddl.atom.app.tddl_sample.qatest_normal_0
  2. group:DEFAULT_GROUP
  3. content:
  4. userName=tddl
  5. minPoolSize=1
  6. maxPoolSize=2
  7. idleTimeout=10
  8. blockingTimeout=5
  9. preparedStatementCacheSize=15
  10. connectionProperties=characterEncoding=gbk

c) User配置:配置訪問密碼 格式:com.taobao.tddl.atom.passwd.dbKey.數據庫類型.用戶名

  1. dataId:com.taobao.tddl.atom.passwd.qatest_normal_0.mysql.tddl
  2. group:DEFAULT_GROUP
  3. content:
  4. encPasswd=5a826c8121945c969bf9844437e00e28

注意此處的encPasswd爲密碼(tddl)的密文,使用JbossPasswordDecode來加密,加密類爲SecureIdentityLoginModule,如圖所示,運行即可算出密文,也能轉換出原文


3. 代碼
由於需要連接diamond獲取信息,因此在測試機上需要配置a.b.c域名,配置詳情請看TDDL+DIAMOND的配置及使用(二)
測試代碼在tddl-sample項目中,運行依賴commons-codec 1.3和commons-httpclient 3.1  ojdbc6,請自行在maven中進行配置,運行AtomSample進行單元測試,如圖表示成功:

仔細看console日誌,發現已經正確連接到了diamond-server中

運行代碼,可以發現數據庫中已經插入了新的數據。

注:如果出現了錯誤請檢查BaseSampleCase類中的 appName dbkey group_key是否正確


TGroupDataSource
TGroupDataSource用於集羣管理,數據源創建一個鏡像數據源形成互備(注意:TDDL不負責數據源之間的數據同步,數據同步需要管理員處理);然後在這兩個數據源之間進行訪問切換。兩個數據源可以在不同的機器上,示例中使用同一臺機器。
1. 設置數據庫

  1. drop database if exists qatest_normal_0_bak;
  2. CREATE DATABASE `qatest_normal_0_bak`
  3. CREATE USER ’tddl’@'%’ IDENTIFIED BY ’tddl’;
  4. GRANT ALL ON qatest_normal_0_bak.* TO ’tddl’@'%’;
  5. CREATE TABLE `normaltbl_0001` (
  6.   `pk` int(11) NOT NULL,
  7.   `id` int(11) DEFAULT NULL,
  8.   `gmt_create` date DEFAULT '2010-12-17',
  9.   `name` varchar(30) DEFAULT NULL,
  10.   `floatCol` float(9,3) DEFAULT '0.000',
  11.   PRIMARY KEY (`pk`)
  12. ) ENGINE=InnoDB DEFAULT CHARSET=GBK

上圖中創建了qatest_normal_0_bak庫,設置同qatest_normal_0
2. 配置數據源
在上面同已經配置了qatest_normal_0的數據源,下面只需要配置集羣信息和qatest_normal_0_bak信息即可。
a) qatest_normal_0_bak的Global配置:配置數據源地址

  1. dataId:com.taobao.tddl.atom.global.qatest_normal_0_bak
  2. group:DEFAULT_GROUP
  3. content:
  4. ip=127.0.0.1
  5. port=3306
  6. dbName=qatest_normal_0_bak
  7. dbType=mysql
  8. dbStatus=RW

b) qatest_normal_0_bak的App配置:配置連接池

  1. dataId:com.taobao.tddl.atom.app.tddl_sample.qatest_normal_0_bak
  2. group:DEFAULT_GROUP
  3. content:
  4. userName=tddl
  5. minPoolSize=1
  6. maxPoolSize=2
  7. idleTimeout=10
  8. blockingTimeout=5
  9. preparedStatementCacheSize=15
  10. connectionProperties=characterEncoding=gbk

c) qatest_normal_0_bak的User配置:配置訪問密碼

  1. dataId:com.taobao.tddl.atom.passwd.qatest_normal_0_bak.mysql.tddl
  2. group:DEFAULT_GROUP
  3. content:
  4. encPasswd=5a826c8121945c969bf9844437e00e28

d) 集羣信息:兩個數據源的訪問配置 格式  com.taobao.tddl.jdbc.group_V2.4.1_groupName

  1. dataId:com.taobao.tddl.jdbc.group_V2.4.1_group_sample
  2. group:DEFAULT_GROUP
  3. content:
  4. 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. 測試代碼 更改測試類繼承的類爲GroupSampleCase即可,修改具體代碼進行測試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章