Я хочу снова подключиться, когда моя связь умрет.
Проблема, которую я получаю, я объяснил здесь https://stackoverflow.com/questions/25504566/jta-transaction-in-other-thread-rolling-back
Я не понял, почему это происходит, но теперь я сделал невозможным возникновение взаимоблокировок, поэтому я буду ждать неделю, чтобы узнать, исправлено ли это.
Но я думал, что моя настройка должна снова подключиться к неудачному соединению. Но вместо этого проблема JTA убивает мою связь, и она не возвращается. Предположительно, потому что это CMT, есть только одно соединение, которое передается через @PersistenceContext
, поэтому тот же EntityManager
используется для всего, поэтому для повторного подключения он должен будет получить новый EntityManager
из EntityManagerFactory
, но он не знает для этого. Я не знаю внутренних дел JBoss и JPA.
Это моя настройка:
<datasources>
<datasource jndi-name="java:/DS" pool-name="DS" enabled="true" use-java-context="true">
<connection-url>jdbc:sqlserver://srv.local:1433;databaseName=AS_DEV</connection-url>
<driver>sqlserver2008</driver>
<pool>
<min-pool-size>5</min-pool-size>
<max-pool-size>50</max-pool-size>
<prefill>false</prefill>
<use-strict-min>false</use-strict-min>
<flush-strategy>FailingConnectionOnly</flush-strategy>
</pool>
<security>
<user-name>user</user-name>
<password>12345</password>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"/>
</validation>
</datasource>
<drivers>
<driver name="sqlserver2008" module="com.microsoft">
<driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
</driver>
</drivers>
</datasources>
Что еще я могу сделать, чтобы обеспечить возобновленное соединение при сбое?
Это фиксировало это:
<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>
Используйте проверку фона с помощью background-validation-millis. Пожалуйста, установите подтверждение на заднюю поверхность на основании вашего требования.
<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>
• <background-validation>true</background-validation>
Если для этого параметра установлено значение "true", установите validate-on-match на "false". Используйте <background-validation-millis>
чтобы настроить частоту проверки. Значение по умолчанию для параметра <background-validation-millis>
равно 0 миллисекундам. Это также означает, что проверка фона отключена. Это значение не должно совпадать с вашим значением <idle-timeout-minutes>
.
• Обратите внимание, что недопустимо использовать как проверку соответствия, так и проверку фона для одного и того же пула. Выбери один.
Принятый ответ позволяет как Validate-на-матча и фону проверки, которые Документы рекомендованные против.
Если производительность менее важна для вас, проверка на соответствие проверяет каждое соединение перед использованием, предотвращая использование мертвых подключений. В противном случае вы можете использовать проверку фона, которая будет меньше ударяться по вашей базе данных, но вы рискуете использовать соединение, которое умерло с момента последней проверки проверки. Краткое изложение двух вариантов, скопированных из документов:
Если для параметра установлено значение true, соединение с базой данных проверяется каждый раз, когда оно извлекается из пула соединений. Этот параметр приводит к быстрому восстановлению, но создает максимальную нагрузку на базу данных.
Это используется в сочетании с значением background-validation-millis, чтобы определить, как часто выполняется проверка фона. Чем ниже значение, тем чаще пул проверяется и более ранние недействительные соединения удаляются из пула. Однако более низкие значения занимают больше ресурсов базы данных. Более высокие значения приводят к менее частым проверкам проверки соединения и использованию меньших ресурсов базы данных, но мертвые соединения не отображаются в течение более длительных периодов времени.
Для автоматического повторного подключения вы должны настроить тег проверки:
<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