我正在使用 Spring 3.0.5、Hibernate 3.6.7、Atomikos TransactionEssentials 3.7.0 和 MySQL 5.5
我最近遇到了这个问题,我的连接池中的连接在 8 小时后超时并被服务器重置,导致出现消息“恢复 XID '???' 提出0:未知
这是我的数据源配置:
<bean id="myDataSource"
class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init"
destroy-method="close"
depends-on="myConfigurer">
<property name="uniqueResourceName" value="myPUDataSource" />
<property name="xaDataSourceClassName" value="$CONF{database.XAdriver}" />
<property name="poolSize" value="10" />
<property name="xaProperties">
<props>
<prop key="user">$CONF{database.user}</prop>
<prop key="password">$CONF{database.password}</prop>
<prop key="URL">$CONF{database.url}</prop>
<prop key="pinGlobalTxToPhysicalConnection">true</prop>
<prop key="autoReconnect">true</prop>
</props>
</property>
</bean>
当我调查时,我发现选项 autoReconnect=true 仅在延迟 2 秒后重新连接我的故障连接(我认为这是可配置的)。浏览网页我发现解决方案建议增加 MySQL-Server 中的 wait_timeout,我认为这不是一个真正的解决方案。应用程序应该能够处理死连接并自动重新连接,因为可能还有其他问题导致连接丢失。(而且无论应用程序使用哪种类型,我都不想对服务器做出任何指令)。
最后我找到了一个很好的解决方案,我将把它作为答案发布,以帮助面临相同或类似问题的人。