2

如果我使用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();
}

我需要关闭会话吗?做得如何?

4

3 回答 3

3
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(),则无需显式关闭它,因为它从持久性上下文中获取当前会话,该会话在事务启动时创建会话并在事务完成时关闭它。

于 2016-12-13T11:16:29.997 回答
0

休眠会话的范围应该是当前的工作单元(即事务)(请记住会话不是线程安全的)。

工厂应该在整个应用程序生命周期中保留。

另请参阅努力理解 EntityManager 的正确使用

于 2016-12-13T10:18:09.890 回答
-1

不。实际上,您的网络框架(如 spring)或声明式事务管理将为您完成此操作。但是在某些情况下,您想自己管理会话。像批处理一样——因为休眠会话缓存不断增长

于 2016-12-13T10:18:05.473 回答