JBoss在连接超时时重新连接
当我的连接死亡时,我想重新连接。
我得到的问题,我在这里解释https://stackoverflow.com/questions/25504566/jta-transaction-in-other-thread-rolling-back
我还没有弄清楚它为什么会发生,但我现在已经无法发生死锁,所以我会等一个星期来看它是否已修复。
但我认为我的设置应该在失败连接时重新连接。 但相反,JTA问题导致了我的连接,而且它没有回来。 大概是因为它是CMT,只有一个连接,它通过@PersistenceContext
传递,所以相同的EntityManager
用于所有东西,所以要重新连接,它必须从EntityManagerFactory
获得一个新的EntityManagerFactory
,但它不知道要做到这一点。 我不知道JBoss和JPA的内部结构。
这是我的设置:
jdbc:sqlserver://srv.local:1433;databaseName=AS_DEV sqlserver2008 5 50 false false FailingConnectionOnly user 12345 com.microsoft.sqlserver.jdbc.SQLServerDriver
我还能做些什么,以确保在失败时恢复连接?
接受的答案可以启用匹配validation和背景validation,这是文档建议的。
如果性能对您不那么重要,validation匹配将在使用前检查每个连接,防止使用任何死连接。 否则,您可以使用后台validation,这对数据库的影响较小,但您可能会冒使用自上次validation检查以来死亡的连接的风险。 从文档中复制的两个选项的快速摘要:
validation上匹配
当该选项设置为true时,每次从连接池签出时都会validation数据库连接。 此设置可实现最快的恢复,但会在数据库上创建最高负载。
背景validation
它与background-validation-millis值结合使用,以确定后台validation运行的频率。 值越小,validation池的频率越高,从池中删除的无效连接越快。 但是,较低的值会占用更多数据库资源。 值越高,连接validation检查频率越低,使用的数据库资源越少,但在较长时间内未检测到死连接。
使用background-validation-millis进行后台validation。 请根据您的要求设置背景validation。
true false 60000
•
当此设置为“true”时,将validate-on-match设置为“false”。 使用
调整validation运行的频率。
参数的默认值为0毫秒。 这也意味着禁用后台validation。 此值不应与
值相同。
•请注意,对同一池使用validate-on-match和background-validation无效。 选择一个。
这解决了它:
true true
要自动重新连接,您必须配置validation标记:
select 1 from dual true 60000
这个例子适用于mysql