[TDR表][Go SDK]查询表记录总数
1. 接口说明
查询表记录总数
2. 版本要求
无特殊要求,所有版本都提供了该接口。
3. 准备工作
参见准备工作文档,完成使用该接口前的准备工作,并创建如下TDR Generic表。service_info表service_info.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<metalib name="service_info" tagsetversion="1" version="1">
<struct name="service_info" version="1" primarykey="gameid,envdata,name,expansion" splittablekey="gameid" >
<entry name="gameid" type="string" size="128" desc="gameapp id"/>
<entry name="envdata" type="string" size="1024" desc="env环境信息" />
<entry name="name" type="string" size="1024" desc="名字" />
<entry name="expansion" type="string" size="1024" desc="扩展字段" />
<entry name="filterdata" type="string" size="1024" desc="过滤标签" />
<entry name="updatetime" type="uint64" desc="最近更新时间,单位ms" />
<entry name="inst_max_num" type="uint64" desc="最大实例个数" />
<entry name="inst_min_num" type="uint64" desc="最小实例个数" />
<entry name="routeinfo_len" type="uint" defaultvalue="0" desc="路由规则信息长度" />
<entry name="routeinfo" type="char" count="1024" refer="routeinfo_len" desc="路由规则信息" />
<index name="index_gameid_envdata_name" column="gameid,envdata,name" />
<index name="index_gameid_envdata" column="gameid,envdata" />
<index name="index_gameid_name" column="gameid,name" />
<index name="index_gameid" column="gameid" />
</struct>
</metalib>
准备工作完成后,将会获得以下信息,这些信息在使用SDK时会被用到:
- 目录服务器地址列表
- 业务ID
- 业务访问密码
- 游戏区ID
- 数据表名
4. 示例代码
示例代码的基本执行过程:
- 定义表配置参数
- 设置日志配置;
- 创建客户端;
- 发送请求并处理响应;
- 销毁客户端。
客户端初始化示例:
package main
import (
"fmt"
"git.woa.com/gcloud_storage_group/tcaplus-go-api"
)
// 定义表配置参数
const (
AppId = uint64(2)
ZoneId = uint32(3)
DirUrl = "tcp://x.x.x.x:xxxx"
Signature = "xxxxxxxxxxxxx"
TableName = "service_info"
)
var client *tcaplus.Client
func main() {
// 创建客户端
client = tcaplus.NewClient()
// 设置日志配置,logconf.xml文件设置了日志级别
if err := client.SetLogCfg("./logconf.xml"); err != nil {
fmt.Println(err.Error())
return
}
// 连接TcaplusDB后端
err := client.Dial(AppId, []uint32{ZoneId}, DirUrl, Signature, 60)
if err != nil {
fmt.Printf("init failed %v\n", err.Error())
return
}
fmt.Printf("Dial finish\n")
getCountExample()
// 程序退出时调用Close销毁客户端
client.Close()
}
4.1 同步调用示例(推荐)
该示例同步调用方式比较类似C++接口的调用方式,需要创建请求和解析响应示例目录
package main
import (
"fmt"
"git.woa.com/gcloud_storage_group/tcaplus-go-api/protocol/cmd"
"git.woa.com/gcloud_storage_group/tcaplus-go-api/terror"
"time"
)
func getCountExample() {
// 创建请求
req, err := client.NewRequest(ZoneId, TableName, cmd.TcaplusApiGetTableRecordCountReq)
if err != nil {
fmt.Printf("NewRequest failed %v\n", err.Error())
return
}
// 使用客户端同步发送请求并接收响应
if resp, err := client.Do(req, time.Duration(2*time.Second)); err != nil {
fmt.Printf("recv err %s\n", err.Error())
return
} else {
// 获取响应消息的错误码
tcapluserr := resp.GetResult()
if tcapluserr != 0 {
fmt.Printf("response ret errCode: %d, errMsg: %s", tcapluserr, terror.GetErrMsg(tcapluserr))
return
}
// 从响应消息中提取记录
fmt.Printf("response success record count %d\n", resp.GetTableRecordCount())
}
}
4.2 异步调用示例
异步发送可以使用较少的协程实现较大的并发,编码相对复杂,示例目录
package main
import (
"fmt"
"git.woa.com/gcloud_storage_group/tcaplus-go-api/logger"
"git.woa.com/gcloud_storage_group/tcaplus-go-api/protocol/cmd"
"git.woa.com/gcloud_storage_group/tcaplus-go-api/terror"
"strconv"
"sync"
"time"
)
func getCountExample() {
wg := sync.WaitGroup{}
wg.Add(1)
// 在另一协程处理响应消息
go func() {
defer wg.Done()
for {
// resp err 均为 nil 说明响应池中没有任何响应
resp, err := client.RecvResponse()
if err != nil {
logger.ERR("RecvResponse error:%s", err)
continue
} else if resp == nil {
time.Sleep(time.Microsecond * 5)
continue
}
//带回请求的异步ID
fmt.Printf("resp success, AsyncId:%d\n", resp.GetAsyncId())
tcapluserr := resp.GetResult()
if tcapluserr != 0 {
fmt.Printf("response ret %s\n",
"errCode: "+strconv.Itoa(tcapluserr)+", errMsg: "+terror.ErrorCodes[tcapluserr])
return
}
//response中带有获取的记录
fmt.Printf("response success record count %d\n", resp.GetTableRecordCount())
return
}
}()
//创建Get请求
req, err := client.NewRequest(ZoneId, TableName, cmd.TcaplusApiGetTableRecordCountReq)
if err != nil {
fmt.Printf("NewRequest failed %v\n", err.Error())
return
}
//设置异步请求ID,异步请求通过ID让响应和请求对应起来
req.SetAsyncId(667)
// 异步发送请求
if err := client.SendRequest(req); err != nil {
fmt.Printf("SendRequest failed %v\n", err.Error())
return
}
wg.Wait()
}
5. 常见问题
详见错误码含义和处理方法。