【发布时间】:2018-01-10 10:14:49
【问题描述】:
我们使用 Hibernate 和 JPA 进行数据库操作,我们还使用 JBoss 数据源 JNDI 用于 Java 1.6 的连接池
每当应用程序第一次尝试连接到数据库时“我们面临连接已关闭错误”,有时我们会遇到以下问题:
org.hibernate.exception.GenericJDBCException: 连接关闭。 javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException:连接是 关闭。在 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1361) 在 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1289) 在 org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:261) 在 com.tm.iswift.ws.masterdata.CRDataDAOImpl.FetchData(CRDataDAOImpl.java:39) 在 com.tm.iswift.ws.masterdata.ClaimReferenceDataBOImpl.FetchData(ClaimReferenceDataBOImpl.java:53) 在 com.tm.iswift.ws.masterdata.ClaimReferenceDataService.masterData(ClaimReferenceDataService.java:90) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213) 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.
persistence.xml 设置为:
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
<property name="hibernate.connection.driver_class"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.JBossTransactionManagerLookup" />
<property name="show_sql" value="true" />
<property name="format_sql" value="true " />
<property name="hibernate.connection.release_mode" value="after_transaction" />
</properties>
以下是 JPA 的配置: 我们甚至尝试将retainmode 和“always”和flushbeforequeries 设置为“with-connection”,但我们遇到的问题与上面提到的相同,
props.put("openjpa.ConnectionRetainMode", "transaction");
props.put("openjpa.FlushBeforeQueries", "true");
entityManager = emFactory.createEntityManager(props);
//entityManager.setFlushMode(FlushModeType.COMMIT);
entityManager.setFlushMode(FlushModeType.AUTO);
以下是我们经常遇到问题的DAO方法:- 在后端,它总是包含一些要为此方法获取的数据。
@Transactional // added
public List<ClaimType> FetchData() throws ISwiftException {
LOGGER.info("CRDataDAOImpl: FetchData: Enter");
List<ClaimType> ctypes = null;
Query lQuery = null;
try {
EntityManager em =getEntityManager();
if (em.isOpen()){} // before assing this also same error we faced
else {em =getEntityManager();} // before assing this also same error we faced
lQuery = (Query) em.createNamedQuery("ClaimType.findAll");
if (em.isOpen()){} // before assing this also same error we faced
else {em =getEntityManager();} // before assing this also same error we faced
ctypes = lQuery.getResultList();
LOGGER.info("CRDataDAOImpl: FetchData: End");
return ctypes;
} catch (PersistenceException exception) {
LOGGER.error("CRDataDAOImpl::FetchData()::REASON OF EXCEPTION=" + exception.getMessage(), exception);
throw new ISwiftException(exception);
} finally {
closeEntityManager();
}
}
如果现有配置无法正常工作,请您帮忙,或者让我知道最后使用 Hibernate 与 DB 交互的最佳方式。
非常感谢。
【问题讨论】:
-
您的连接由 JBoss 汇集,如果空闲时间过长,它们就会失效。要解决此问题,请指定定义 JNDI 数据源的验证查询。
-
嗨安德烈亚斯,谢谢。您能否详细说明“指定定义 JNDI 数据源的验证查询”
-
我有一些在线链接,将检查...非常感谢
-
当您说您正在使用 Hibernate 时,为什么要发布 OpenJPA 的配置?你不能同时使用这两个!!!
-
嗨 Andreas,我在 jboss 6 中找不到该选项,