gpt4 book ai didi

java - Spring 3 DataSourceTransactionManager 在将事务获取到 MySQL 时偶尔超时

转载 作者:行者123 更新时间:2023-11-29 23:46:16 24 4
gpt4 key购买 nike

简而言之,当我在几分钟没有使用事务后尝试获取连接时,第一个事务设置失败。

当一切正常运行时,我的日志显示简单事务的以下内容:

DEBUG: org.springframework.transaction.annotation.AnnotationTransactionAttributeSource - Adding transactional method 'getRecord' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,timeout_30; ''
DEBUG: org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [com.example.services.Service.getRecord]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,timeout_30; ''
DEBUG: org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [jdbc:mysql://dev-db.example.com:3306/example, UserName=foo@1.2.3.4, MySQL Connector Java] for JDBC transaction
DEBUG: org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [jdbc:mysql://dev-db.example.com:3306/example, UserName=foo@1.2.3.4, MySQL Connector Java] to manual commit

但是,如果我有几分钟没有任何 Activity ,我会收到以下消息:

DEBUG: org.springframework.transaction.annotation.AnnotationTransactionAttributeSource - Adding transactional method 'getRecord' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,timeout_30; ''
DEBUG: org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [com.example.services.Service.getRecord]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,timeout_30; ''

到目前为止我的观察:

  • 似乎是基于不活动,但我在重新启动 Tomcat 后立即看到了这种行为,尽管没有其他任何东西访问数据库,所以我认为它是针对网络元素(例如我的 MySQL 服务器)的不活动。
  • 当我的应用程序启动时,它会从数据库发出一些没有任何问题的非事务性请求,因此它似乎与事务有关。
  • @Transactional 表示法中的超时元素在这种情况下无效。它似乎最终会超时,但需要 15 分钟(!)。
  • 虽然此交易请求繁忙超时,但我可以成功发出后续请求。
  • 似乎不是一个饥饿的本地连接池。我在重新启动 Tomcat 后就看到了这一点。

当它最终超时时(我有没有提到 15 分钟!),我得到以下信息:

DEBUG: org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [org.apache.commons.dbcp.PoolableConnection@3269c671] for JDBC transaction
DEBUG: org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [connection is closed] to manual commit
DEBUG: org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource
DEBUG: org.springframework.jdbc.datasource.DataSourceUtils - Could not close JDBC Connection
ERROR: java.sql.SQLException: Already closed.
ERROR: org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 1,312,604 milliseconds ago. The last packet sent successfully to the server was 924,748 milliseconds ago.
Caused by: java.net.SocketException: Connection timed out

运行 Spring 3.1.1、mysql 5.1.32、commons-dbcp 1.4 和 commons-pool 1.5.4。

有人知道这是什么吗?

最佳答案

您的问题是 MySQL 服务器超时空闲 JDBC 连接。这与 TransactionManager 设置无关。

看看您的数据源设置。它应在连接检索时测试连接和/或验证池中的空闲连接。

在 commons-dbcp 中,您可以通过 testOnBorrow 和validationQuery 属性设置连接检索测试。

关于java - Spring 3 DataSourceTransactionManager 在将事务获取到 MySQL 时偶尔超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25925672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com