-
Notifications
You must be signed in to change notification settings - Fork 55
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") |
以下方法可用于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(?, ?, ?)