写点什么

Java jdbc 驱动 maxPerformance 配置避坑

  • 2024-03-22
    北京
  • 本文字数:931 字

    阅读完需:约 3 分钟

作者: TNTT 原文来源:https://tidb.net/blog/b5652904

一、现象

https://docs.pingcap.com/zh/tidb/stable/performance-tuning-practices#%E5%BA%94%E7%94%A8%E9%85%8D%E7%BD%AE-1

官方文档建议使用 maxPerformance 屏蔽 JDBC 向数据库发送的一些查询设置类的 SQL 语句


发现使用 maxperformance 后,数据库事务行为和预想的不一致。


具体情况如下



二、排查

useConfigs = maxPerformance 在 Mysql-connector 等同于如下的一组配置


cachePrepStmts=truecacheCallableStmts=truecacheServerConfiguration=trueuseLocalSessionState=trueelideSetAutoCommits=truealwaysSendSetIsolation=falseenableQueryTimeouts=falseconnectionAttributes=none
复制代码


其中 jdbc 驱动是依赖 useLocalSessionState 这个变量,来决定是使用数据库本身的 auto commit 状态还是直接根据 java 的配置直接发送事务配置命令给数据库


Should the driver refer to the internal values of auto-commit and transaction isolation that are set by 'Connection.setAutoCommit()' and 'Connection.setTransactionIsolation()' and transaction state as maintained by the protocol,rather than querying the database or blindly sending commands to the database for 'commit()' or 'rollback()' method calls?
复制代码


再根据 jdbc 驱动源码验证



Jdbc 创建连接的时候会去看 tidb 里的 autocommit 和 init_connect 的值,但看起来不论如何,都会给 jdbc 内部的 autocommit 变量设置为 true。即 tidb 里的 autocommit 不论设成什么,jdbc 都认为是 true。


Jdbc 通过 uselocalseesionstate、autocommit == autocommitflag 判断是否该发 autocommit 给服务器。



从代码逻辑来看:


  1. 当 tidb 为 true,jdbc 为 true 时,不重新设置事务状态

  2. 当 tidb 为 true,jdbc 为 false,显示设置会话事务状态

  3. 当 tidb 为 false,jdbc 为 true,不重新设置会话事务状态

  4. 当 tidb 为 false,jdbc 为 false,显示设置会话事务状态

三、结论

当使用 useConfigs = maxPerformance 时候,如果关闭 TiDB 数据库层面的 auto commit,同时代码里 con.setAtuCommit(true) 会导致这部分事务一直不提交,数据写入不成功,需要通过在 jdbc 里使用 useLocalSessionState=true 来解决



发布于: 刚刚阅读数: 3
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
Java jdbc 驱动 maxPerformance 配置避坑_开发语言_TiDB 社区干货传送门_InfoQ写作社区