1. 程式人生 > 其它 >【深入理解TcaplusDB技術】Java實現TDR表的增刪查改操作

【深入理解TcaplusDB技術】Java實現TDR表的增刪查改操作

【深入理解TcaplusDB技術】Java實現TDR表的增刪查改操作

說明

TDR表是基於TDR協議設計的TcaplusDB表,TDR協議是騰訊自研的RPC通訊協議,用於TcaplusDB儲存資料的序列化、反序列化等操作,相比於PB表(Protocol協議表)在傳輸效率及傳輸質量上有一定優勢,在騰訊遊戲內部有廣泛應用基礎,具體關於TDR表的定義說明可參考章節:表定義語言(PB,TDR)。TDR表定義以xml格式來定義表結構,支援豐富的資料型別,請參考章節:資料型別(PB, TDR)

快速入手TDR協議表的開發涉及幾個步驟,下面介紹如何基於TcalusDB本地Docker版環境,快速上手基於Java進行TDR表的增刪查改操作。所有操作均在申請的開發測試機或雲主機進行。

 

基礎環境準備

Docker環境準備

在開始示例程式碼演示之前,需要提前準備好TcaplusDB本地Docker環境及tcapluscli工具,具體請參考資料:[Linux] TcaplusDB Local版部署

Java環境準備

 

Java SDK示例依賴JDK環境部署,JDK版本:openjdk-1.7以上。在不同環境安裝方式如下:

#CentOS7環境安裝,安裝jdk1.8版本
yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel

#Debian8.2環境安裝,安裝1.7版本
apt-get install openjdk-7-jre openjdk-7-jdk

 

TcaplusDB環境準備

TcaplusDB表準備

準備TDR表示例檔案

表名: test, 表型別: GENERIC,表定義具體內容儲存在test.xml。檔案具體內容如下:

<?xml version="1.0" encoding="GBK" standalone="yes" ?>               
<metalib name="table_test" tagsetversion="1" version="1">              
   <struct name="test" version="1" splittablekey="gameid"  primarykey="gameid,itemid,name">              
       <entry name="gameid" type="uint" />                
       <entry name="itemid" type="uint" />              
       <entry name="name" type="string" size="5" />              
       <entry name="typeid" type="uint8"/>              
       <entry name="data" type="tinyuint" defaultvalue="9"/>              
       <entry name="uname" type="string" size="5" defaultvalue="ab"/>              
       <index name="index_id" column="gameid" />              
   </struct>
</metalib>

 

TcaplusDB叢集準備

對於TcaplusDB,在建立表之前需要建立對應的表叢集。對於Docker本地版,叢集已經預設建立好一個供大家使用,所以不用再建立叢集。

TcaplusDB表格組準備

表建立依賴於表格組,需要在預設叢集下建立一個表格組。建立表格組依賴tcapluscli工具,關於tcapluscli的使用,具體可參考:表格組相關操作命令

#查看錶格組幫助命令
./tcapluscli tablegroup -h
#建立一個表格組,id指定為4, endpoint-url,用於docker環境連線使用, group name由字母、數字和下劃線組成
./tcapluscli tablegroup create --endpoint-url=http://localhost --access-id=2 --group-id=4 --group-name=zone_4

TcaplusDB表建立

現在正式進入表建立環節,在上述表格組基礎上建立一個TDR表,執行建立表命令,如下所示:

#查看錶建立命令提示幫助
./tcapluscli table -h

#建立一個表, 指定endpoint-url, 叢集接入ID: 2 (TDR叢集), 表格組id: group-id, 表型別: TDR, 表定義檔案: table_test.xml,放當前路徑
./tcapluscli table create --endpoint-url=http://localhost  --access-id=2 --group-id=4 --schema-type=TDR --schema-file=test.xml

#查看錶是否建立成功
./tcapluscli table describe --endpoint-url=http://localhost --access-id=2 --group-id=4 --list

 

示例程式碼

獲取公共環境資訊

引數 獲取方法
目錄服務地址列表 *.*.*.*:9999 獲取目錄服務地址列表
業務ID/叢集ID 8 獲取叢集ID
業務密碼 **************** 獲取業務密碼
表格組ID 4 獲取表格組ID
表格名稱 test  

獲取依賴包

包名 下載地址 用途
tcaplus-service-api-3.32.0 下載 Java SDK包
org.slf4j:slf4j-api:1.7.5 下載 Java SDK依賴的第三方包,用於輸出日誌 。

如果使用Maven作為Java專案管理工具,則可以將獲取的jar包,匯入到Maven倉庫中,再通過配置pom.xml,引入到專案中即可。

示例程式碼

將下述示例程式碼儲存至Example.java

示例程式碼

import com.tencent.tcaplus.client.Client;
import com.tencent.tcaplus.client.ClientFactory;
import com.tencent.tcaplus.client.Record;
import com.tencent.tcaplus.client.Request;
import com.tencent.tcaplus.client.Response;
import com.tencent.tdr.tcaplus_protocol_cs.TcaplusProtocolCsConstants;

import java.util.ArrayList;
import java.util.List;

public class Example {

   public static void main(String[] arguments) {
       // 1. 準備環境資訊
       // 1.1. 目錄服務地址列表,對於Docker本地版:dir地址為docker部署的機器內網ip地址,埠預設為9999;對於線上雲環境,為叢集連線內網地址,埠預設為9999
       List<String> dirList = new ArrayList<String>();
       dirList.add("tcp://localhost:9999");
       // 1.2. 業務ID,接入ID,對於Docker本地版: TDR表預設為2,PB表預設為3; 對於線上雲環境,根據實際建立的叢集接入ID填寫
       int appId = 2;
       // 1.3. 業務密碼,對於Docker本地版:可以通過開啟oms本地環境檢視對應TDR業務的叢集密碼,業務管理->業務維護->選擇TDR業務,檢視叢集密碼; 對於線上雲環境,根據自行設定的密碼填寫
       String appPassword = "****************";
       // 1.4. 表格組ID,替換為自己建立的表格組id
       int tableGroupId = 4;
       // 1.5. 表格名稱, 替換為自己建立的表名
       String tableName = "test";

       // 2. 建立客戶端
       Client client = ClientFactory.createClient(appId, tableGroupId, appPassword, dirList);
       try {
           // 插入資料
           insert(client, tableName);

           // 獲取資料
           select(client, tableName);

           // 修改資料
           update(client, tableName);

           // 刪除資料
           delete(client, tableName);
      } finally {
           // 3. 銷燬客戶端物件
           ClientFactory.destroyClient(client);
      }
  }

   private static void insert(Client client, String tableName) {
       // 1. 構造插入資料的請求
       // 1.1. 獲取請求物件。為了提升SDK效能,Request物件是複用的
       Request request = client.acquireRequest();
       // 1.2. 設定請求型別和目標表名
       request.setCmd(TcaplusProtocolCsConstants.TCAPLUS_CMD_INSERT_REQ);
       request.setTableName(tableName);
       // 1.3. 設定資料各欄位的值,這裡要注意Key欄位和Value欄位,使用的是不同的方法設定欄位值
       Record record = request.addRecord();
       record.setKeyInt("gameid", 1);
       record.setKeyInt("itemid", 1);
       record.setKeyString("name", "test");
       record.setValueByte("typeid", (byte) 1);
       record.setValueByte("data", (byte) 1);
       record.setValueString("uname", "test");

       // 2. 傳送請求,並獲取結果
       Response response = client.