Wildfly и автоматическое повторное подключение к базе данных

21

У меня есть клиент, сервер и база данных. Клиент взаимодействует с сервером через удаленные интерфейсы EJB. Как сервер - я использую Wildfly 8.2.0. В качестве базы данных я использую MySQL. Сервер связывается с MySQL через JPA / Hibernate. Когда я выключаю сервер MySQL - Wildfly выдает исключение, конечно. Но когда я снова включаю MySQL, Wildfly все равно бросает ту же ОШИБКУ . Я должен отключить Wildfly и вернуть его обратно, чтобы Wildfly снова подключился к базе данных.

Как установить автоматическое повторное подключение в Wildfly?

Я попытался установить автоматическое повторное подключение по URL-адресу соединения: jdbc:mysql://localhost/db?autoReconnect=true&amp;useUnicode=yes&amp;characterEncoding=UTF8 , и я попытался добавить в файл standalone-full.xml, который я использую, эту строку: <check-valid-connection-sql>select 1</check-valid-connection-sql> , но оба решения не работают.

автономный-full.xml:

<!-- ... -->
<datasource jta="true" jndi-name="java:jboss/datasources/MySQLDS" pool-name="MySQLDS" enabled="true" use-ccm="true">
    <connection-url>jdbc:mysql://localhost/db?autoReconnect=true&amp;amp;useUnicode=yes&amp;amp;characterEncoding=UTF8</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <driver>mysqlDriver</driver>
    <security>
        <user-name>user</user-name>
        <password>***</password>
    </security>
    <validation>
        <check-valid-connection-sql>select 1</check-valid-connection-sql>
        <validate-on-match>false</validate-on-match>
        <background-validation>false</background-validation>
    </validation>
    <timeout>
        <set-tx-query-timeout>false</set-tx-query-timeout>
        <blocking-timeout-millis>0</blocking-timeout-millis>
        <idle-timeout-minutes>0</idle-timeout-minutes>
        <query-timeout>0</query-timeout>
        <use-try-lock>0</use-try-lock>
        <allocation-retry>0</allocation-retry>
        <allocation-retry-wait-millis>0</allocation-retry-wait-millis>
    </timeout>
    <statement>
        <share-prepared-statements>false</share-prepared-statements>
    </statement>
</datasource>
<drivers>
    <driver name="mysqlDriver" module="com.mysql">
        <xa-datasource-class>com.mysql.jdbc.Driver</xa-datasource-class>
    </driver>
</drivers>
<!-- ... -->
    
задан Robert 24.02.2015 в 23:30
источник

3 ответа

11

Я решил эту проблему, изменив значение validate-on-match на true в моем файле standalone-full.xml:

<validate-on-match>true</validate-on-match>     

ответ дан Robert 25.02.2015 в 10:53
источник
  • это позволяет использовать старое поведение. Из документа doc: (docs.jboss.org/jbossas/docs/Server_Configuration_Guide/beta500/...) <validate-on-match> - До JBoss 4.0.5 проверка соединения произошла, когда уровень JCA попытался сопоставить управляемое соединение. С добавлением <background-validation> это больше не требуется. Указание <validate-on-match> заставляет старое поведение. ПРИМЕЧАНИЕ. Обычно это НЕ используется в сочетании с <background-validation> –  Domenico Briganti 01.04.2015 в 11:10
  • Возможно, вы правы @dometec, но я могу подтвердить, что на Wildfly 10 вам нужно проверить правильность в действии, иначе Wildfly никогда не будет повторно подключаться к пулу соединений, если вы откажетесь от MySQL. Я пробовал проверку фона и не работает. Я думаю, что это ошибка. –  Rob Mascaro 06.03.2016 в 10:29
  • Настройка проверки фона работала для меня только после того, как я установил также background-validation-millis, как в ответе @ dometec. Wildfly 10.1 и SqlServer здесь. –  inovaovao 04.10.2016 в 10:41
20

Это работает над Wildfly 8.1:

         <datasource jta="true" jndi-name="java:jboss/datasources/xxxdb" pool-name="xxxxDB" enabled="true" use-ccm="false">
          <connection-url>jdbc:mysql://localhost:3306/xxxdb?autoReconnect=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=UTF-8</connection-url>
          <driver-class>com.mysql.jdbc.Driver</driver-class>
          <driver>mysql-connector-java-5.1.26-bin.jar</driver>
          <security>
              <user-name>xxxuser</user-name>
              <password>xxxpassword</password>
          </security>
          <validation>
              <check-valid-connection-sql>select 1</check-valid-connection-sql>
              <validate-on-match>false</validate-on-match>
              <background-validation>true</background-validation>
              <background-validation-millis>10000</background-validation-millis>
          </validation>
          <statement>
              <share-prepared-statements>false</share-prepared-statements>
          </statement>
        </datasource>
    
ответ дан Domenico Briganti 01.04.2015 в 11:09
источник
  • Мы используем базу данных Oracle и не работаем над этим решением, не могли бы вы предложить, что нужно сделать для оракула. –  RKG 02.07.2015 в 11:33
  • Для оракула утверждение должно быть, вероятно, «выбрать 1 из двойного» –  Ryan 05.02.2018 в 19:06
1

Вы можете установить <background-validation> в true , потому что этот параметр имеет лучшую производительность и установите <validate-on-match> в false

    
ответ дан alireza alallah 14.06.2017 в 09:59
источник