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当此设置为“true”时,将validate-on-match设置为“false”。 使用调整validation运行的频率。 参数的默认值为0毫秒。 这也意味着禁用后台validation。 此值不应与值相同。

•请注意,对同一池使用validate-on-match和background-validation无效。 选择一个。

这解决了它:

    true true  

要自动重新连接,您必须配置validation标记:

   select 1 from dual  true 60000  

这个例子适用于mysql