【问题标题】:How to handle Hibernate connections如何处理休眠连接
【发布时间】:2017-11-21 18:43:43
【问题描述】:

我是 Hibernate 的新手。我已经创建了 SessionFactory 并获得了 Session,如下所示。我正在使用 c3p0 连接提供程序

public static SessionFactory getSessionFactory() {
    try {
        if (sessionFactory == null) {
            Configuration configuration = loadDBConfiguration();
            if (configuration != null) {
                sessionFactory = configuration.buildSessionFactory();
            } else {
                log.info("---- Configuration failed ----");
            }
        }
    } catch (Exception ex) {
        log.info("---- Initial SessionFactory creation failed ----");
    }
    return sessionFactory;
}

public static EntityManagerFactory getEntityManagerFactory() {
    try {
        Session session = getSessionFactory().openSession();
        entityManagerFactory = session.getEntityManagerFactory();
    } catch (Exception e) {
        log.error(e);
    }
    return entityManagerFactory;
}

public static EntityManager getEntityManager() {
    try {
        EntityManagerFactory entityManagerFactory = getEntityManagerFactory();
        return entityManagerFactory.createEntityManager();  
    } catch (Exception e) {
        log.error(e);
    }
    return null;
}

我对下面的事情感到困惑。

  1. 我应该在 commit() 后关闭连接,还是 c3p0 连接提供程序将在 commit() 后关闭。
  2. 我应该在每个请求上调用 getEntityManager() 还是应该像单例一样使用
  3. 如果我被用作单例,那么如果服务器同时收到多个请求,它是否会影响任何并行 transaction.begin() 或 transaction.commit()。
  4. 此外,在单例中,实体仍会在会话中持续存在,直到它被手动关闭或清除。那么在这种情况下我需要做什么。

目前,getEntityManager() 在我的所有 EntityManager 类(如 UserManager、AccountsManager)中都被调用。在 RDS 中经过一段时间后,它显示为 20 个连接,甚至我的应用程序也没有处理任何用户请求。

【问题讨论】:

    标签: java hibernate c3p0


    【解决方案1】:

    您应该关闭您的连接。由于您的连接被数据库连接池包装,它们不会被物理关闭,但它们会返回到池中。这需要完成,否则连接池会认为正在使用连接,并且当您达到池限制时,将不会打开新连接。 将会话工厂保持为单例。您应该为每个线程打开一个新会话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 2011-01-05
      • 2016-09-07
      • 1970-01-01
      相关资源
      最近更新 更多