hibernate - JBoss AS 7.x -JPA 网络故障后如何重新建立连接

标签 hibernate jpa-2.0 jboss7.x

我的应用程序使用 JPA(Hbernate ORM) 连接到部署在 JBoss AS 7.x 服务器中的 SQL server 2008。如果网络出现故障并再次出现,我将收到以下异常

14:59:27,996 ERROR [stderr] (http-localhost-127.0.0.1-8080-1) javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: The connection is closed.
14:59:28,002 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1361)
14:59:28,012 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1289)
14:59:28,020 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:261)
14:59:28,025 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at com.honeywell.domoweb.dataservice.dao.impl.UserDaoImpl.getUsers(UserDaoImpl.java:372)
14:59:28,030 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
14:59:28,034 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
14:59:28,039 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
14:59:28,044 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at java.lang.reflect.Method.invoke(Method.java:597)
14:59:28,047 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
14:59:28,052 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
14:59:28,058 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
14:59:28,064 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
14:59:28,069 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
14:59:28,075 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
14:59:28,080 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at $Proxy66.getUsers(Unknown Source)
14:59:28,083 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at com.honeywell.domoweb.dataservice.dao.impl.TemplateDaoImpl.getTemplate(TemplateDaoImpl.java:44)
14:59:28,089 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)...

我搜索了这个问题,发现这个问题需要更改连接池配置才能使用 autoReconnect 属性再次重新连接,但没有找到任何示例,如何将 autoReconnect 嵌入我的连接池设置。下面是我的Standalone.xml文件中的连接池设置

<subsystem xmlns="urn:jboss:domain:datasources:1.0">
        <datasources>


            <datasource jndi-name="java:jboss/datasources/DataServiceDS" pool-name="dataServicePool" enabled="true" use-java-context="true">
                <connection-url>jdbc:sqlserver://ipaddress:1433;databaseName=myDataBase</connection-url>
                <driver>sqlserver</driver>
                <pool>
                    <min-pool-size>10</min-pool-size>
                    <max-pool-size>100</max-pool-size>
                    <prefill>true</prefill>
                </pool>
                <security>
                    <user-name>usename</user-name>
                    <password>password</password>
                </security>
            </datasource>
            <drivers>

                <driver name="sqlserver" module="com.microsoft.sqlserver">
                    <xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</xa-datasource-class>
                </driver>
            </drivers>
        </datasources>
    </subsystem>

能否请您告诉我,如果网络出现故障并再次重新连接,如何重新连接到数据库?

最佳答案

你可以添加

<check-valid-connection-sql>select 1 </check-valid-connection-sql>

到您的数据源配置,或您想要的任何其他 sql 语句。 每次从连接池中 check out 连接时都会执行此 sql 语句,如果语句失败,即连接已关闭,它将被销毁并重新创建/重新连接到 sql server。这将确保您的应用程序( hibernate )始终获得有效的 sql 连接。

关于hibernate - JBoss AS 7.x -JPA 网络故障后如何重新建立连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13066212/

相关文章:

hibernate - 从 grails 中的 Java 类访问数据库

java - 带子查询的 JPA 条件查询

java - 具有重复数据和列表的 JPA native 查询结果集映射

java - JBOSS 7 - Spring ContextLoaderListener ClassNotFoundException

java - 实体异常映射中的重复列

java - 将 JSON 对象映射到通用 Map 对象

java - 如何使用注释获取hornetq connetionfactory对象

java - 错误 [org.jboss.msc.service.fail](MSC 服务线程 1-4)MSC00001 : Failed to start service

java - Grails Hibernate session 问题 - 未能延迟初始化集合

java - org.hibernate.hql.internal.ast.ErrorCounter : unexpected token: (