gpt4 book ai didi

java - 选择后是否需要关闭 hibernate session ?

转载 作者:行者123 更新时间:2023-11-30 08:30:36 27 4
gpt4 key购买 nike

如果我使用SessionFactory

private SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
public Session getSession() {
return sessionFactory.openSession();
}

并在我的 DAO 类中使用它:

public List<Entity> fetchEntities(Date fromDate, Date toDate) {
Criteria criteria = getSession().createCriteria(Entity.class);
criteria.add(Restrictions.between("cts", fromDate, toDate));
criteria.addOrder(Order.desc("cts"));
return (List<Entity>) criteria.list();
}

我需要关闭 session 吗?如何治愈?

最佳答案

public List<Entity> fetchEntities(Date fromDate, Date toDate) {
Criteria criteria = getSession().createCriteria(Entity.class);
criteria.add(Restrictions.between("cts", fromDate, toDate));
criteria.addOrder(Order.desc("cts"));
return (List<Entity>) criteria.list();
}

Need I close session or not? How correctly do it?

如果您创建一个 session 实例并为每个执行的查询关闭它,它可能会工作,但它也可能有副作用,例如连接池瓶颈或内存过度使用。
close() 释放 JDBC 连接并执行一些清理。

org.hibernate.Interface Session 类的Connection close() 方法指出:

End the session by releasing the JDBC connection and cleaning up.

所以你不应该为每个执行的查询打开和关闭 session 。
当与客户端请求/处理(用户、批处理...)关联的所有查询都已执行时,您应该关闭连接。
当然,如果客户端请求包含单个查询,则在查询执行后关闭它是有意义的。


实际上,您使用 SessionFactory.openSession() 创建一个未绑定(bind)到 Hibernate 持久性上下文的新 session 。
这意味着您必须在完成使用 session 时明确关闭 session ,否则它将永远不会关闭。
假设该方法是在客户端请求中执行的单个方法,您可以这样写:

public List<Entity> fetchEntities(Date fromDate, Date toDate) {
Session session;
try{
session = getSession();
Criteria criteria = session.createCriteria(Entity.class);
criteria.add(Restrictions.between("cts", fromDate, toDate));
criteria.addOrder(Order.desc("cts"));
return (List<Entity>) criteria.list();
}
finally {
if (session != null) {
session.close();
}
}

请注意,如果您使用了 SessionFactory.getCurrentSession(),则不需要显式关闭它,因为它会从创建 session 的持久性上下文中获取当前 session 交易开始时关闭,交易结束时关闭。

关于java - 选择后是否需要关闭 hibernate session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41118493/

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