Skip to content

DasClient Hints使用手册

He, Jiehui edited this page Oct 25, 2019 · 7 revisions

简介

Hints的目的是为数据库操作提供额外的参数,以方便对缺省情况之外的场景进行处理。

Hints的设置相关API大部分是流式API,方便用户流畅操作

注意

  • Hints不是线程安全对象,请每次使用前创建新的Hints对象实例,避免在不同DAS方法间共用相同Hints对象实例,以免互相干扰。
  • 除了本文档明确列出的方法,Hints中其他方法为内部使用所需,请

插入操作主键处理相关

方法 说明 示例
insertWithId() 插入的时候使用用户在实体中给定的主键(目前SqlServer不支持该功能) dao.insert(p, hints().insertWithId())
setIdBack() 插入的时候把数据库生成的ID赋值给实体中的主键字段(目前SqlServer不支持该功能) dao.insert(p, hints().setIdBack())

分库分表相关

方法 说明 示例
inShard(String shardId) 指定操作所在的数据库分片 pk = dao.queryByPk(pk, hints().inShard("1"))
inShard(Integer shardId) 指定操作所在的数据库分片(整形) pk = dao.queryByPk(pk, hints().inShard(1))
shardValue(Object value) 指定用于计算操作所在数据库分片的值 pk = dao.queryByPk(pk, hints().shardValue(i))
inTableShard(String tableShardId) 指定操作所在的表分片 dao.insert(p, hints().inTableShard("2"))
inTableShard(Integer tableShardId) 指定操作所在的表分片(整形) dao.insert(p, hints().inTableShard(2))
tableShardValue(Object tableShardValue) 指定用于计算操作所在表分片的值 dao.insert(p, hints().tableShardValue("2"))

分库分表相关

方法 说明 示例
freshness(int seconds) 指定读操作中从库要达到的新鲜度,如果从库新鲜度小于此值,则读从库,反正读主库 new Hints().freshness(5)
masterOnly() 指定读操作必须走主库 new Hints().masterOnly()
slaveOnly() 指定读操作必须走从库,如果没哟符合条件的从库,则报错(没什么用处的hints) new Hints().slaveOnly(5)
inDatabase(String databaseName) 指定操作必须在指定的物理库上执行,参数是物理库的唯一ID new Hints().inDatabase("connectionString")

Statement参数相关

以下方法可用于JDBC调用级别的参数调整。

方法 说明 示例
fetchSize(int fetchSize) 设置Statement的setFetchSize new Hints().fetchSize(1000)
maxRows(int maxRows) 设置Statement的setMaxRows new Hints().maxRows(1000)
timeout(int seconds) 设置Statement的setQueryTimeout, 单位为秒,既设置操作几秒超时 new Hints().timeout(10)

监控相关

利用diagnose()方法指定操作要记录详细步骤信息,可以看到Das生成的SQL语句。可以很方便的查看分库分表时操作执行的详情 示例:

Hints hints = Hints.hints();
pk = dao.queryByPk(pk, hints.diagnose());
DasDiagnose diag = hints.getDiagnose();
System.out.println(diag);//可以看到生成的SQL语句

或者在SqlBuilder中使用:

SqlBuilder sb = SqlBuilder.....
Hints hints = sb.hints().diagnose();
dao.query(sb);
DasDiagnose diag = hints.getDiagnose();
System.out.println(diag);//可以看到生成的SQL语句

示例

一个简单数据库的batchInsert操作

das.caller = com.ppdai.das.client.delegate.imp.ctrip.DasClientTraceTest.testInsertList(DasClientTraceTest.java:124)
das.clientMethod = com.ppdai.das.client.DasClient.batchInsert(DasClient.java:47)
das.version = 0.0.1-SNAPSHOT
    task.type = single task
        statement = 210156003
            success = true
            exception = 
            cost = {'Decode'='340', 'Connect'='0', 'Prepare'='11', 'Execute'='3', 'ClearUp'='8'}
            databaseName = dal_shard_0
            databaseKeyName = dal_shard_0
            logicDbName = MySqlSimple
            isMaster = true
            dbCategory = MySql
            dbConnectString = jdbc:mysql://localhost:3306/dal_shard_0
            sql[0] = /*1000002234-DasClientTraceTest.testInsertList(DasClientTraceTest.java:124)*/INSERT INTO `person` (`Name`, `CityID`, `CountryID`) VALUES(?, ?, ?)