Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring3数据源TransactionManager在将事务获取到MySQL时偶尔超时_Java_Mysql_Spring_Transactions_Spring Transactions - Fatal编程技术网

Java Spring3数据源TransactionManager在将事务获取到MySQL时偶尔超时

Java Spring3数据源TransactionManager在将事务获取到MySQL时偶尔超时,java,mysql,spring,transactions,spring-transactions,Java,Mysql,Spring,Transactions,Spring Transactions,简而言之,当我在几分钟没有使用事务后尝试建立连接时,第一个事务设置失败 工作正常时,我的日志显示了一个简单事务的以下内容: DEBUG: org.springframework.transaction.annotation.AnnotationTransactionAttributeSource - Adding transactional method 'getRecord' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,time

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

工作正常时,我的日志显示了一个简单事务的以下内容:

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
但是,如果我有几分钟没有任何活动,我会收到以下消息:

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表示法中的timeout元素无效。它似乎最终会超时,但需要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属性设置连接检索测试。

将您的ApplicationContext.xml放在此处。我也在想,只是当我的应用程序启动时,它会发出三个快速请求,但不会超时,但第一个事务失败。除非事务使用具有不同空闲时间超时的单独连接类型,否则我不能断定这是连接范围内的问题。在应用程序启动时完成的请求不会在连接池刚刚创建时超时。取决于设置…继续…取决于数据源的设置,他们甚至可能获得新创建的virgin连接。事务有一个超时值,这是日志中可见的30秒,是的,该值会传播到MySQl Jdbc连接中。但是,IMHO此值用于限制一个事务的持续时间,而不是限制一个连接上两个事务之间的时间。可以在事务级别配置此值,例如在@Transactional上。您可以尝试将其设置为0,这对于MySQL意味着“从不”。然而,正确的解决方案是设置数据源的testOnBorrow属性。