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();
}
我需要关闭会话吗?如何正确地做到这一点?
如果您为每个执行的查询创建会话实例并关闭它,它可能会起作用,但也可能会产生副作用,例如连接池瓶颈或内存过度使用。
close()
释放 JDBC 连接并执行一些清理。
org.hibernate.Interface Session类的 Connection close()
方法 说明:
通过释放 JDBC 连接并清理来结束会话。
因此,您不应为每个执行的查询打开和关闭会话。
您应该在执行与客户端请求/处理(用户、批处理...)相关的所有查询时关闭连接。
当然,如果客户端请求包含单个查询,则在查询执行后关闭它是有意义的。
实际上,您使用SessionFactory.openSession()
它会创建一个未绑定到 Hibernate 持久性上下文的新会话。
这意味着您必须在完成使用会话时明确关闭会话,否则它将永远不会关闭。
假设该方法是在客户端请求中执行的单个方法,您可以编写如下内容:
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()
,则无需显式关闭它,因为它从持久性上下文中获取当前会话,该会话在事务启动时创建会话并在事务完成时关闭它。