Wildfly并自动重新连接到数据库

Rob*_*ert 28 java mysql jboss ejb wildfly

我有一个客户端,一个服务器和一个数据库.客户端通过EJB远程接口与服务器通信.作为服务器 - 我使用Wildfly 8.2.0.作为数据库 - 我使用MySQL.服务器通过JPA/Hibernate与MySQL通信.当我关闭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>
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)

Dom*_*nti 24

这适用于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>
Run Code Online (Sandbox Code Playgroud)

  • 对于oracle,语句应该是"从双重中选择1" (2认同)

Rob*_*ert 14

我通过在standalone-full.xml文件中将validate-on-match值更改为true来解决此问题:

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

  • 这可以实现旧的行为.来自doc:(https://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/beta500/html/ch13s13.html)__ <validate-on-match> - 在JBoss 4.0.5之前,当发生连接验证时JCA层尝试匹配托管连接.通过添加<background-validation>,不再需要这样做.指定<validate-on-match>会强制执行旧行为.注意:这通常不与<background-validation> __一起使用 (3认同)
  • 设置背景验证只有在我按照@ dometec的答案设置background-validation-millis之后才适合我.Wildfly 10.1和SqlServer在这里. (3认同)
  • 你可能对@dometec,但我可以确认,在Wildfly 10上你需要验证匹配才真实,否则如果你弹跳MySQL,Wildfly永远不会成功重新连接到连接池.我已经尝试过背景验证,但是无效.我认为这是一个错误. (2认同)

Ali*_*lah 6

您可以设置<background-validation>true,因为此选项具有更好的性能,并设置<validate-on-match>false