gpt4 book ai didi

java - 如何处理 Hibernate 连接

转载 作者:太空宇宙 更新时间:2023-11-04 10:54:53 24 4
gpt4 key购买 nike

我是 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. 此外,在单例中,实体仍然保留在 session 中,直到手动关闭或清除。那么在这种情况下我需要做什么。

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

最佳答案

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

关于java - 如何处理 Hibernate 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47420434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com