写点什么

【深入理解 TcaplusDB 技术】Java 实现 TDR 表的增删查改操作

作者:数据人er
  • 2022 年 5 月 16 日
  • 本文字数:5049 字

    阅读完需:约 17 分钟

【深入理解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
复制代码

示例代码

获取公共环境信息

获取依赖包


如果使用 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.poll(request);         System.out.println(response.toString());        // 3. 处理结果        if (response.getResult() == 0) {            // 插入数据成功            // TODO 可在此处添加处理数据插入成功的后续处理代码        } else {            // 插入数据失败            // TODO 可在此处添加处理数据插入失败的后续处理代码        }    }     private static void select(Client client, String tableName) {        // 1. 构造查询数据的请求        // 1.1. 获取请求对象。为了提升SDK性能,Request对象是复用的        Request request = client.acquireRequest();        // 1.2. 设置请求类型和目标表名        request.setCmd(TcaplusProtocolCsConstants.TCAPLUS_CMD_GET_REQ);        request.setTableName(tableName);        // 1.3. 设置各个Key字段的值        Record record = request.addRecord();        record.setKeyInt("gameid", 1);        record.setKeyInt("itemid", 1);        record.setKeyString("name", "test");        // 1.4. 添加需要查询的Value字段        request.addFieldName("typeid");        request.addFieldName("data");        request.addFieldName("uname");         // 2. 发送请求,并获取结果        Response response = client.poll(request);                   // 3. 处理结果        if (response.getResult() == 0) {            // 查询数据成功            Record result = response.fetchRecord();            System.out.println(result.toString());            // TODO 可在此处添加处理数据查询成功的后续处理代码        } else {            // 查询数据失败            // TODO 可在此处添加处理数据查询失败的后续处理代码            System.out.println(response.toString());        }    }     private static void update(Client client, String tableName) {        // 1. 构造更新数据的请求        // 1.1. 获取请求对象。为了提升SDK性能,Request对象是复用的        Request request = client.acquireRequest();        // 1.2. 设置请求类型和目标表名        request.setCmd(TcaplusProtocolCsConstants.TCAPLUS_CMD_UPDATE_REQ);        request.setTableName(tableName);        // 1.3. 设置各Key字段的值。说明:Key字段值是不允许更新的        Record record = request.addRecord();        record.setKeyInt("gameid", 1);        record.setKeyInt("itemid", 1);        record.setKeyString("name", "test");        // 1.4. 设置各Value字段的新值        record.setValueByte("typeid", (byte) 1);        record.setValueByte("data", (byte) 1);        record.setValueString("uname", "test");         // 2. 发送请求,并获取结果        Response response = client.poll(request);         System.out.println(response.toString());         // 3. 处理结果        if (response.getResult() == 0) {            // 更新数据成功            // TODO 可在此处添加处理数据更新成功的后续处理代码        } else {            // 更新数据失败            // TODO 可在此处添加处理数据更新失败的后续处理代码        }    }     private static void delete(Client client, String tableName) {        // 1. 构造删除数据的请求        // 1.1. 获取请求对象。为了提升SDK性能,Request对象是复用的        Request request = client.acquireRequest();        // 1.2. 设置请求类型和目标表名        request.setCmd(TcaplusProtocolCsConstants.TCAPLUS_CMD_DELETE_REQ);        request.setTableName(tableName);        // 1.3. 设置各Key字段的值        Record record = request.addRecord();        record.setKeyInt("gameid", 1);        record.setKeyInt("itemid", 1);        record.setKeyString("name", "test");         // 2. 发送请求,并获取结果        Response response = client.poll(request);                 System.out.println(response.toString());        // 3. 处理结果        if (response.getResult() == 0) {            // 删除数据成功            // TODO 可在此处添加处理数据删除成功的后续处理代码        } else {            // 删除数据失败            // TODO 可在此处添加处理数据删除失败的后续处理代码        }    } }
复制代码

示例代码运行

示例代码编译

将上述下载的 tcaplus-service-api-3.32.0.jar 包和 slf4j-api-1.7.5.jar 包放至和 Demo.java 同等级目录,执行如下命令编译:


javac -cp ./tcaplus-service-api-3.32.0.jar:./slf4j-api-1.7.5.jar Demo.java
复制代码


示例代码运行


java -cp ./tcaplus-service-api-3.32.0.jar:./slf4j-api-1.7.5.jar Demo
复制代码





TcaplusDB 是腾讯出品的分布式 NoSQL 数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB 级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。

用户头像

数据人er

关注

还未添加个人签名 2021.03.09 加入

还未添加个人简介

评论

发布
暂无评论
【深入理解TcaplusDB技术】Java实现TDR表的增删查改操作_数据库_数据人er_InfoQ写作社区