【问题标题】:The connection is closed JPA , hibernate , Java 1.6连接关闭 JPA , hibernate , Java 1.6
【发布时间】: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 中找不到该选项,

标签: java spring hibernate jpa


【解决方案1】:

我已经多次遇到同样的问题,在大多数情况下对我有用的是手动获取连接对象,然后使用结果集对象对数据库执行查询,如下所述:

Session session = (Session) entityManager.unwrap(Session.class);

Connection conn = ((SessionImpl) session).connection();

//这里可以检查连接对象是否为空。

ResultSet rs = conn.createStatement().executeQuery(你的字符串查询);

希望对你有帮助

【讨论】:

  • 您的意思是不要使用 JPA 而是使用 JDBC ?!这有点否定了使用 JPA 的意义,不是吗?为什么不解决实际问题...
  • 我完全同意你的看法,但是有一些 JPA 不支持的特殊场景(或者很难处理),例如(与这个问题无关),但我试图从中获取 BLOB 对象使用 entityManager 的 Oracle 数据库,这是不可能的,但是使用 ResultSet 很简单。
  • 您尚未确定 OP 是否存在“超出 JPA 范围”的情况,您只是说获取 JDBC 连接并破解它。
  • 没错!如果您可以阅读我的帖子,我建议了对我有用的方法。在这种情况下建议一些对我有用的东西不会造成任何伤害。它也可能对他有用。
【解决方案2】:

谢谢安德烈亚斯!

ValidationQuery 可以解决问题和 jBOSS Datasrouce 特定设置,例如“Check Valid Sql & Validate On Match”,相关设置可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-04
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    相关资源
    最近更新 更多