[Java SDK]查询表结构
1. 接口说明
从指定的表格读取表结构数据。
2. 版本要求
无特殊要求,所有版本都提供了该接口。
3. 准备工作
参见准备工作文档,完成使用该接口前的准备工作,并创建TDR表。
准备工作完成后,将会获得以下信息,这些信息在使用SDK时会被用到:
- 目录服务器地址列表
- 业务ID
- 业务访问密码
- 游戏区ID
- 数据表名
4. 示例代码
示例代码的基本执行过程:
- 创建客户端;
- 构建请求;
- 发送请求;
- 处理响应;
- 销毁客户端。
4.1. 同步调用示例代码
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.tcaplus.util.TdrType;
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. 目录服务地址列表
List<String> dirList = new ArrayList<String>();
dirList.add("tcp://x.x.x.x:9999");
dirList.add("tcp://y.y.y.y:9999");
// 1.2. 业务ID
int appId = 1;
// 1.3. 业务密码
String appPassword = "****************";
// 1.4. 表格组ID
int tableGroupId = 1;
// 1.5. 表格名称
String tableName = "test";
// 2. 创建客户端
Client client = ClientFactory.createClient(appId, tableGroupId, appPassword, dirList);
try {
// 3. 构造查询数据的请求
// 3.1. 获取请求对象。为了提升SDK性能,Request对象是复用的
Request request = client.acquireRequest();
// 3.2. 设置请求类型和目标表名。
req.setCmd(TcaplusProtocolCsConstants.TCAPLUS_CMD_METADATA_GET_REQ);
request.setTableName(tableName);
// 4. 发送请求,并获取结果
Response response = client.poll(request);
// 5. 处理结果
if (response.getResult() == 0) {
// 获取表结构成功
ResponseLite rspLite = (ResponseLite) response;
TableMetadata meta = rspLite.getMetadata();
//获取表字段
List<TableMetadata.KeyColumn> keyColumnList = meta.keyColumnList;
//表字段类型
for (TableMetadata.KeyColumn keyColumn:keyColumnList) {
int type = keyColumn.type;
switch (type) {
case TdrType.TCAPLUS_RECORD_TYPE_BINARY:
//
break;
case TdrType.TCAPLUS_RECORD_TYPE_DOUBLE:
//
break;
default:
//
break;
}
}
} else {
// 获取表结构失败,可能是表不存在
}
} finally {
// 6. 销毁客户端对象
ClientFactory.destroyClient(client);
}
}
}
4.2. 异步调用示例代码
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.tcaplus.util.TdrType;
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. 目录服务地址列表
List<String> dirList = new ArrayList<String>();
dirList.add("tcp://x.x.x.x:9999");
dirList.add("tcp://y.y.y.y:9999");
// 1.2. 业务ID
int appId = 1;
// 1.3. 业务密码
String appPassword = "****************";
// 1.4. 表格组ID
int tableGroupId = 1;
// 1.5. 表格名称
String tableName = "test";
// 2. 创建客户端
Client client = ClientFactory.createClient(appId, tableGroupId, appPassword, dirList);
try {
// 3. 构造查询数据的请求
// 3.1. 获取请求对象。为了提升SDK性能,Request对象是复用的
Request request = client.acquireRequest();
// 3.2. 设置请求类型和目标表名。
req.setCmd(TcaplusProtocolCsConstants.TCAPLUS_CMD_METADATA_GET_REQ);
request.setTableName(tableName);
CountDownLatch latch = new CountDownLatch(1);
// 4. 异步发送请求,并指定返回结果处理器,post方法会立即返回
client.post(request, new Future() {
@Override
public void onResponse(Response response) {
// 5. 处理结果
if (response.getResult() == 0) {
// 获取表结构成功
ResponseLite rspLite = (ResponseLite) response;
TableMetadata meta = rspLite.getMetadata();
//获取表字段
List<TableMetadata.KeyColumn> keyColumnList = meta.keyColumnList;
//表字段类型
for (TableMetadata.KeyColumn keyColumn:keyColumnList) {
int type = keyColumn.type;
switch (type) {
case TdrType.TCAPLUS_RECORD_TYPE_BINARY:
//
break;
case TdrType.TCAPLUS_RECORD_TYPE_DOUBLE:
//
break;
default:
//
break;
}
}
} else {
// 获取表结构失败,可能是表不存在
}
}
});
latch.await();
} finally {
// 6. 销毁客户端对象
ClientFactory.destroyClient(client);
}
}
}
5. 请求对象中的方法说明
注:如有未列出来的Request对象方法,即表示该方法在读取数据的场景下是无效的。
方法签名 | 方法说明 |
---|---|
void setCmd(int cmd) |
设置请求类型(指令)。cmd:请求类型,固定为TcaplusProtocolCsConstants.TCAPLUS_CMD_METADATA_GET_REQ |
void setTableName(String tableName) |
设置目标表名。tableName:目标表名,不能为null。 |
6. 响应对象中的方法说明
注:如有未列出来的Response对象方法,即表示该方法在查询数据的场景下是无效的。
方法签名 | 方法说明 |
---|---|
int getResult() |
获取读取数据请求的响应码。0表示操作成功。非0表示操作异常,参见响应码含义说明。 |
7. ResponseLite对象方法说明
注:如有未列出来的ResponseLite对象方法,即表示该方法在查询数据的场景下是无效的。
方法签名 | 方法说明 |
---|---|
TableMetadata getMetadata() |
获取表格的meta结构。非null表示操作成功,null表示操作异常。 |
8. TableMetadata对象说明
注:如有未列出来的TableMetadata对象方法,即表示该方法在查询数据的场景下是无效的。
成员变量 | 成员变量说明 |
---|---|
type | 表格类型,目前支持TCAPLUS_TABLE_TYPE_GENERIC和TCAPLUS_TABLE_TYPE_LIST两种。 |
listMaxElementNum | List中一个Key支持的最多元素个数。 |
keyColumnList | Key字段元数据信息。 |
valueColumnList | Value字段元数据信息。 |
9. TableMetadata.KeyColumn对象说明
注:如有未列出来的TableMetadata.KeyColumn对象方法,即表示该方法在查询数据的场景下是无效的。
成员变量 | 成员变量说明 |
---|---|
type | 字段类型。 |
name | 字段名称。 |
10. TableMetadata.ValueColumn对象说明
注:如有未列出来的TableMetadata.ValueColumn对象方法,即表示该方法在查询数据的场景下是无效的。
成员变量 | 成员变量说明 |
---|---|
type | 字段类型。 |
name | 字段名称。 |
11. 常见问题
详见错误码含义和处理方法。
12. 其它参考文档
无