我有一个客户端,一个服务器和一个数据库。客户端通过EJB远程接口与服务器通信。作为服务器 - 我使用Wildfly 8.2.0。作为数据库 - 我使用MySQL。服务器通过JPA / Hibernate与MySQL通信。当我关闭MySQL服务器时 - 当然,Wildfly会引发异常。但是当我再次打开MySQL时 - Wildfly仍会抛出相同的ERROR。我要关闭Wildfly,然后将Wildfly重新连接到数据库。
如何在Wildfly中设置自动重新连接?
我尝试在连接网址中设置自动重新连接:jdbc:mysql://localhost/db?autoReconnect=true&useUnicode=yes&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;useUnicode=yes&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>
<!-- ... -->
答案 0 :(得分: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;useUnicode=true&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>
答案 1 :(得分:14)
我通过在standalone-full.xml文件中将validate-on-match值更改为true来解决此问题:
<validate-on-match>true</validate-on-match>
答案 2 :(得分:3)
您可以将<background-validation>
设置为true
,因为此选项具有更好的效果,并将<validate-on-match>
设置为false
答案 3 :(得分:1)
我的回复有点晚了,但是要允许重新连接,您应该使用 validate-on-match = true 并激活后台验证。它们是相互排斥的。 如果不这样做,则需要将所有连接刷新到池中,以便丢弃过时的连接。
失败后如何重新连接到数据库的示例(使用连接验证)是:how to validate Database connection with WildFly