1

我在我的项目中使用休眠,它进展顺利,但我的问题是我有点困惑,我正在编写休眠函数的好方法。下面我粘贴我的代码块以了解我是如何编写休眠函数的,请检查它并告诉我它是否是正确的方法。这是我的块代码结构

SessionFactory sessionFactory = 
                (SessionFactory) ServletActionContext.getServletContext().getAttribute(HibernateListener.KEY_NAME);
        Session hibernatesession = sessionFactory.openSession();
        try {
            hibernatesession.beginTransaction();
            // my database access will be here
            hibernatesession.getTransaction().commit();
            hibernatesession.flush();
            }
        catch(Exception e){
          hibernatesession.getTransaction().rollback();
          e.printStackTrace();
        }finally{
          hibernatesession.close();
        }

这是我为所有 dao 类函数创建的结构,但现在我的网站加载速度非常慢。所以我的问题是我使用的限制是正确的。是上面的代码导致一次打开多个会话休眠。

4

2 回答 2

1

flush()后面的没用commit()

您真的需要为每个操作打开一个新会话然后关闭它吗?

您可以使用sessionFactory.getCurrentSession()Hibernatesession.disconnect()

于 2012-06-30T20:36:45.643 回答
1

在 DAO 类中进行事务管理并不是一个好的设计。我强烈推荐使用 Spring 及其声明式事务管理,设置起来很容易,使用起来也很容易。如果这对你来说不可用,那么你至少应该让一个穷人的选择。一个建议是让每个 DAO 成为具有执行样板部分(会话打开/关闭、事务开始/提交)的方法的类的子类,并调用可覆盖的方法来完成实际工作。这将为您的场景实现模板模式。这是一个大纲:

public abstract class DaoTemplate
{
  public void execute() {
    final Session s = ((SessionFactory) ServletActionContext.getServletContext()
        .getAttribute(HibernateListener.KEY_NAME)).openSession();
    try {
      s.beginTransaction();
      doTheRealStuff();
      s.getTransaction().commit();
    }
    catch(Exception e) {
      s.getTransaction().rollback();
      e.printStackTrace();
    } finally { s.close(); }
  }

  protected abstract void doTheRealStuff();
}

另一个建议,也是我十年前在一个项目中实际使用的东西,是实现策略模式。在这种情况下,您会将一个对象传递给execute实现该方法的对象doTheRealStuff。此外,在这种情况下,DaoTemplate该类可能是一个单例(那么该类的不同名称将是合适的)。

于 2012-06-30T20:48:43.293 回答