gpt4 book ai didi

java - 如何正确清理 Hibernate Session

转载 作者:行者123 更新时间:2023-12-02 08:00:03 25 4
gpt4 key购买 nike

我在我的应用程序中使用 Hibernate,并注意到每当抛出 Hibernate 错误时,应用程序最终都会因与数据库相关的错误而崩溃。据我所知,问题在于 Hibernate session 处于某种不可用状态,因此需要被丢弃。但是,它会被返回到池中并在下一次调用时重新使用,而不是被丢弃。

在每个函数开始时确保 session 可用的正确方法是什么,如果不可用,则确保正确丢弃它并启动新 session ?

我的 Hibernate 配置文件包含以下内容:

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.timeout">60</property>
<property name="hibernate.c3p0.idle_test_period">45</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.preferredTestQuery">SELECT 1;</property>
<property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
<property name="hibernate.c3p0.acquireRetryAttempts">3</property>

我的有此错误的代码(完整的函数调用)是:

public static ReturnCodes newUser(Long id, String username, String country) {

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();

//check for duplicate user
User checkUser = getUserByExternalID(id, true);
if (checkUser != null && checkUser.getId().intValue() == id.intValue()) {
transaction.commit();
return ReturnCodes.DUPLICATE;
}

User newUser = new User();
newUser.setUsername(username);
newUser.setExternalID(id);
newUser.setCountry(country);

session.save(newUser);
transaction.commit();
return ReturnCodes.SUCCESS;
} catch (ConstraintViolationException e) {
log.info("The user must already exists, so cleanup and return DUPLICATE.");
return ReturnCodes.DUPLICATE;
} catch (Exception e) {
log.info("An unknown error occurred, so cleanup and return GENERAL FAILURE.");
return ReturnCodes.GENERAL_FAILURE;
}
}
public static User getUserByExternalID(Long userid, boolean leaveTransaction) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
User user = null;
try {
session.beginTransaction();
Criteria c = session.createCriteria(User.class);
c.add(Restrictions.eq("externalID", userid));
user = (User)c.uniqueResult();
if (!leaveTransaction)
session.getTransaction().commit();
} catch (Exception e) {
log.error("Could not retrieve user with External ID " + userid, e);
}
return user;
}

最佳答案

session 和事务管理有点复杂。

Spring 已经实现了它,通过使用 @Transactional 注解方法。

如果您想手动处理该问题,read this 。您可以使用Filter来启动 session ,或者使用一些代理和ThreadLocal。最常见的是,每个请求都会创建一个 session 。

关于java - 如何正确清理 Hibernate Session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9039754/

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