JBoss在连接超时时重新连接

时间:2014-08-28 13:22:24

标签: java spring sql-server-2008 jpa jboss

我想在连接断开时重新连接 我得到的问题,我在这里解释https://stackoverflow.com/questions/25504566/jta-transaction-in-other-thread-rolling-back
我还没弄清楚为什么会发生这种情况,但是我现在已经不可能发生死锁,所以我会等一个星期来看它是否已经修好。

但我认为我的设置应该在连接失败时重新连接。但相反,JTA问题导致了我的连接,并且它没有回来。大概是因为它是CMT,只有一个连接,它通过@PersistenceContext传递,因此相同的EntityManager用于所有内容,所以要重新连接,它必须得到一个新的{{1}来自EntityManager,但它不知道这样做。我不知道JBoss和JPA的内部结构。

这是我的设置:

EntityManagerFactory

我还能做些什么,以确保在失败时恢复连接?

4 个答案:

答案 0 :(得分:2)

接受的答案启用了匹配验证和背景验证,the docs建议不要这样做。

如果性能对您不那么重要,验证匹配将在使用前检查每个连接,防止使用任何死连接。否则,您可以使用后台验证,这对您的数据库的影响较小,但您可能会冒使用自上次验证检查以来死亡的连接的风险。从文档中复制的两个选项的快速摘要:

验证-上匹配

当该选项设置为true时,每次从连接池签出时都会验证数据库连接。此设置可实现最快的恢复,但会在数据库上创建最高负载。

背景验证

这与background-validation-millis值结合使用,以确定后台验证的运行频率。值越低,验证池的频率越高,从池中删除的无效连接越快。但是,较低的值会占用更多数据库资源。值越高,连接验证检查频率越低,使用的数据库资源越少,但是在较长时间内未检测到死连接。

答案 1 :(得分:2)

使用background-validation-millis进行后台验证。请根据您的要求设置背景验证。

query

<validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker" /> <background-validation>true</background-validation> <validate-on-match>false</validate-on-match> <background-validation-millis>60000</background-validation-millis> </validation> 当这被设置为&#34; true&#34;将valid-on-match设置为&#34; false。&#34;使用<background-validation>true</background-validation>调整验证运行的频率。 <background-validation-millis>参数的默认值为0毫秒。这也意味着禁用了后台验证。此值不应与<background-validation-millis>值相同。

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

答案 2 :(得分:0)

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

<validation>
    <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
    <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
    <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
    <background-validation>true</background-validation>
    <background-validation-millis>60000</background-validation-millis>
</validation>

此示例适用于mysql

答案 3 :(得分:-1)

这解决了它:

   <validation>
       <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"/>
       <validate-on-match>true</validate-on-match>
       <background-validation>true</background-validation>                      
   </validation>