我想在连接断开时重新连接
我得到的问题,我在这里解释https://stackoverflow.com/questions/25504566/jta-transaction-in-other-thread-rolling-back
我还没弄清楚为什么会发生这种情况,但是我现在已经不可能发生死锁,所以我会等一个星期来看它是否已经修好。
但我认为我的设置应该在连接失败时重新连接。但相反,JTA问题导致了我的连接,并且它没有回来。大概是因为它是CMT,只有一个连接,它通过@PersistenceContext
传递,因此相同的EntityManager
用于所有内容,所以要重新连接,它必须得到一个新的{{1}来自EntityManager
,但它不知道这样做。我不知道JBoss和JPA的内部结构。
这是我的设置:
EntityManagerFactory
我还能做些什么,以确保在失败时恢复连接?
答案 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>