连接是关闭JPA,hibernate,Java 1.6

时间:2018-01-10 10:14:49

标签: java spring hibernate jpa

我们正在使用Hibernate和JPA进行数据库操作,我们也使用JBoss数据源JNDI与Jav​​a 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的方法,我们多次面对这个问题: -       在后端,它总是包含一些要获取此方法的数据。

&#13;
&#13;
 @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;
&#13;
&#13;

如果现有配置无效的话,请你帮忙解决这个问题,或者让我知道最后与数据库与Hibernate交互的最佳方式。

非常感谢提前。

2 个答案:

答案 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;匹配时验证”,相关设置可以解决问题。