Skip to content

Commit 0802be3

Browse files
authored
java-app-best-practices: Add readOnlyPropagatesToServer (#21378) (#21452)
1 parent fa81e75 commit 0802be3

File tree

1 file changed

+4
-12
lines changed

1 file changed

+4
-12
lines changed

develop/java-app-best-practices.md

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ JDBC 实现通常通过 JDBC URL 参数的形式来提供实现相关的配置
104104

105105
和上一条类似,在监控中通过 **Query Summary** > **CPS By Instance** 查看请求中 `COM_STMT_EXECUTE` 数目是否远远多于 `COM_STMT_PREPARE` 来确认是否正常。
106106

107+
#### `readOnlyPropagatesToServer`
108+
109+
请禁用 `readOnlyPropagatesToServer` 参数。启用该参数时,JDBC 驱动会向服务器发送 `SET SESSION TRANSACTION READ ONLY` 语句。TiDB 不支持该语句。此外,发送该语句也没有必要,因为所有 TiDB 节点都支持读写连接。
110+
107111
#### Batch 相关参数
108112

109113
在进行 batch 写入处理时推荐配置 `rewriteBatchedStatements = true`,在已经使用 `addBatch``executeBatch` 后默认 JDBC 还是会一条条 SQL 发送,例如:
@@ -120,8 +124,6 @@ pstmt.executeBatch();
120124

121125
虽然使用了 batch 但发送到 TiDB 语句还是单独的多条 insert:
122126

123-
{{< copyable "sql" >}}
124-
125127
```sql
126128
insert into t(a) values(10);
127129
insert into t(a) values(11);
@@ -130,16 +132,12 @@ insert into t(a) values(12);
130132

131133
如果设置 `rewriteBatchedStatements = true`,发送到 TiDB 的 SQL 将是:
132134

133-
{{< copyable "sql" >}}
134-
135135
```sql
136136
insert into t(a) values(10),(11),(12);
137137
```
138138

139139
需要注意的是,insert 语句的改写,只能将多个 values 后的值拼接成一整条 SQL,insert 语句如果有其他差异将无法被改写。例如:
140140

141-
{{< copyable "sql" >}}
142-
143141
```sql
144142
insert into t (a) values (10) on duplicate key update a = 10;
145143
insert into t (a) values (11) on duplicate key update a = 11;
@@ -148,8 +146,6 @@ insert into t (a) values (12) on duplicate key update a = 12;
148146

149147
上述 insert 语句将无法被改写成一条语句。该例子中,如果将 SQL 改写成如下形式:
150148

151-
{{< copyable "sql" >}}
152-
153149
```sql
154150
insert into t (a) values (10) on duplicate key update a = values(a);
155151
insert into t (a) values (11) on duplicate key update a = values(a);
@@ -158,16 +154,12 @@ insert into t (a) values (12) on duplicate key update a = values(a);
158154

159155
即可满足改写条件,最终被改写成:
160156

161-
{{< copyable "sql" >}}
162-
163157
```sql
164158
insert into t (a) values (10), (11), (12) on duplicate key update a = values(a);
165159
```
166160

167161
批量更新时如果有 3 处或 3 处以上更新,则 SQL 语句会改写为 multiple-queries 的形式并发送,这样可以有效减少客户端到服务器的请求开销,但副作用是会产生较大的 SQL 语句,例如这样:
168162

169-
{{< copyable "sql" >}}
170-
171163
```sql
172164
update t set a = 10 where id = 1; update t set a = 11 where id = 2; update t set a = 12 where id = 3;
173165
```

0 commit comments

Comments
 (0)