JBoss переподключение по истечении времени подключения

1

Я хочу снова подключиться, когда моя связь умрет.
Проблема, которую я получаю, я объяснил здесь 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>

Что еще я могу сделать, чтобы обеспечить возобновленное соединение при сбое?

Теги:
spring
sql-server-2008
jpa
jboss

4 ответа

0
Лучший ответ

Это фиксировало это:

   <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>
  • 2
    Это неправильный ответ. В соответствии с jboss when - background-validation установлен в «true», установите validate-on-match в «false». Это создаст проблемы с производительностью.
  • 0
    Я знаю, что говорят документы, что вы должны использовать один или другой. По крайней мере, для JBoss EAP 6.0, использование обоих было единственным, что сработало для меня.
Показать ещё 3 комментария
2

Используйте проверку фона с помощью 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>.

• Обратите внимание, что недопустимо использовать как проверку соответствия, так и проверку фона для одного и того же пула. Выбери один.

2

Принятый ответ позволяет как Validate-на-матча и фону проверки, которые Документы рекомендованные против.

Если производительность менее важна для вас, проверка на соответствие проверяет каждое соединение перед использованием, предотвращая использование мертвых подключений. В противном случае вы можете использовать проверку фона, которая будет меньше ударяться по вашей базе данных, но вы рискуете использовать соединение, которое умерло с момента последней проверки проверки. Краткое изложение двух вариантов, скопированных из документов:

проверки-на-матч

Если для параметра установлено значение true, соединение с базой данных проверяется каждый раз, когда оно извлекается из пула соединений. Этот параметр приводит к быстрому восстановлению, но создает максимальную нагрузку на базу данных.

фон-валидация

Это используется в сочетании с значением background-validation-millis, чтобы определить, как часто выполняется проверка фона. Чем ниже значение, тем чаще пул проверяется и более ранние недействительные соединения удаляются из пула. Однако более низкие значения занимают больше ресурсов базы данных. Более высокие значения приводят к менее частым проверкам проверки соединения и использованию меньших ресурсов базы данных, но мертвые соединения не отображаются в течение более длительных периодов времени.

  • 1
    Stackoverflow просто напомнил мне об этом вопросе, потому что сейчас у него 1000 просмотров. Итак, я подумал, что просто хочу заметить, что, несмотря на документацию, в которой говорится, что это не нужно, решение работает уже более года, тогда как ни один из этих вариантов сам по себе не работает. Не знаю.
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню