[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时会被用到:

  1. 目录服务器地址列表
  2. 业务ID
  3. 业务访问密码
  4. 游戏区ID
  5. 数据表名

4. 示例代码

示例代码的基本执行过程:

  1. 定义表配置参数
  2. 设置日志配置;
  3. 创建客户端;
  4. 发送请求并处理响应;
  5. 销毁客户端。

客户端初始化示例:

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. 常见问题

详见错误码含义和处理方法

6. 其它参考文档

[TDR表][C++ SDK]查询表记录总数接口说明

results matching ""

    No results matching ""