我们正在使用Hibernate和JPA进行数据库操作,我们也使用JBoss数据源JNDI与Java 1.6进行连接池
每当第一次应用程序尝试连接到DB"我们面临连接已关闭错误"有时在我们之间我们面临以下问题:
org.hibernate.exception.GenericJDBCException:The 连接已关闭。 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)at 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) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(Method.java:597)at 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和#34;总是&#34;和flushbeforequeries为&#34; with-connection&#34;但是我们面临的问题与上面提到的相同,
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();
}
}
&#13;
如果现有配置无效的话,请你帮忙解决这个问题,或者让我知道最后与数据库与Hibernate交互的最佳方式。
非常感谢提前。
答案 0 :(得分:0)
我多次遇到过同样的问题,在大多数情况下对我有用的是手动获取连接对象,然后使用Result set对象对数据库执行查询,如下所述:
会话会话=(会话)entityManager.unwrap(Session.class);
连接conn =((SessionImpl)session).connection();
//在这里你可以检查连接对象是否为空。
ResultSet rs = conn.createStatement()。executeQuery(你的字符串查询);
希望有所帮助
答案 1 :(得分:0)
感谢Andreas!
ValidationQuery可以解决问题和jBOSS Datasrouce特定设置,例如“检查有效的Sql&amp;匹配时验证”,相关设置可以解决问题。