【问题标题】:Massive number of "SET autocommit=0/1" queries in MySQLMySQL 中大量的“SET autocommit=0/1”查询
【发布时间】:2017-02-04 18:37:55
【问题描述】:

我正在我们的系统上运行一些负载测试,我注意到正在执行大量“SET autocommit=0”和“SET autocommit=1”查询。 1分钟内大约25,000。我正在尝试找出造成这种情况的原因以及如何摆脱它。

我们使用以下技术:

  • MySQL

  • 休眠

  • 弹簧

  • 雄猫

我尝试了以下方法,但似乎没有帮助:

  • MySQL 中的“SET autocommit = 0”

  • 在数据库连接 URL 中添加了 elideSetAutoCommits 属性。 "jdbc:mysql://localhost/db_name?useUniCode=true&characterEncoding=UTF-8&pinGlobalTxToPhysicalConnection=true&elideSetAutoCommits=true"

有人可以指出可能导致这些查询的原因吗?

【问题讨论】:

  • 只是一个猜测:Hibernate 在事务之前和之后会发出这些“设置自动提交”吗?您也许可以尝试找出、调试应用程序并注意哪些命令准确到达 MySQL 连接。

标签: java mysql database hibernate hikaricp


【解决方案1】:

有人可以指出可能导致这些查询的原因吗?

您的查询是Connection#setAutoCommit(boolean) 的结果,该Connection#setAutoCommit(boolean) 用于从默认模式自动提交模式 切换到事务模式,以便insert/update/delete/read交易中的数据。

常用代码是:

// Switch to transactional mode which actually triggers a SET autocommit = 0
con.setAutoCommit(false);
try {
    // Some operations on the db
    con.commit();
} finally {
    // Switch back to auto-commit mode which actually triggers a SET autocommit = 1
    con.setAutoCommit(true);
} 

这是一个很好的链接,解释了how transactions work in JDBC


如果您知道您的连接池将始终用于在事务模式下获取连接,您可以在Hikari 的配置中设置默认模式,这要归功于参数autoCommit 设置为false 这种方式连接将已经处于事务模式,因此不再需要修改模式。

此属性控制连接的默认自动提交行为 从池中返回。它是一个布尔值。默认值:true

更多关于Hikarihere的配置细节。

【讨论】:

  • 在将建议的 hikari 属性 autoCommit 设置为 false SET autocommit=1 重复查询停止后,但我仍然收到 SET autocommit=0 重复查询。
猜你喜欢
  • 2019-06-18
  • 2015-08-20
  • 2011-02-26
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多