Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 4 additions & 12 deletions develop/java-app-best-practices.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ JDBC 实现通常通过 JDBC URL 参数的形式来提供实现相关的配置

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

#### `readOnlyPropagatesToServer`

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

#### Batch 相关参数

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

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

{{< copyable "sql" >}}

```sql
insert into t(a) values(10);
insert into t(a) values(11);
Expand All @@ -130,16 +132,12 @@ insert into t(a) values(12);

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

{{< copyable "sql" >}}

```sql
insert into t(a) values(10),(11),(12);
```

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

{{< copyable "sql" >}}

```sql
insert into t (a) values (10) on duplicate key update a = 10;
insert into t (a) values (11) on duplicate key update a = 11;
Expand All @@ -148,8 +146,6 @@ insert into t (a) values (12) on duplicate key update a = 12;

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

{{< copyable "sql" >}}

```sql
insert into t (a) values (10) on duplicate key update a = values(a);
insert into t (a) values (11) on duplicate key update a = values(a);
Expand All @@ -158,16 +154,12 @@ insert into t (a) values (12) on duplicate key update a = values(a);

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

{{< copyable "sql" >}}

```sql
insert into t (a) values (10), (11), (12) on duplicate key update a = values(a);
```

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

{{< copyable "sql" >}}

```sql
update t set a = 10 where id = 1; update t set a = 11 where id = 2; update t set a = 12 where id = 3;
```
Expand Down
Loading