【发布时间】: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;
}
我对下面的事情感到困惑。
- 我应该在 commit() 后关闭连接,还是 c3p0 连接提供程序将在 commit() 后关闭。
- 我应该在每个请求上调用 getEntityManager() 还是应该像单例一样使用
- 如果我被用作单例,那么如果服务器同时收到多个请求,它是否会影响任何并行 transaction.begin() 或 transaction.commit()。
- 此外,在单例中,实体仍会在会话中持续存在,直到它被手动关闭或清除。那么在这种情况下我需要做什么。
目前,getEntityManager() 在我的所有 EntityManager 类(如 UserManager、AccountsManager)中都被调用。在 RDS 中经过一段时间后,它显示为 20 个连接,甚至我的应用程序也没有处理任何用户请求。
【问题讨论】: