在java中,每个线程只能有一个hibernate会话吗?

时间:2014-03-25 21:28:46

标签: java hibernate session

所以我正在开发一个没有多线程的应用程序。我们有一个主业务逻辑方法,可以打开这样的Hibernate会话:

session = HibernateSessionFactory.getSession();
tx = session.beginTransaction();

然后执行一些轻型DB操作(一些选择)。然后调用我在子类中重写的方法,该方法需要执行另一个select。我不能将会话作为参数传递而不必更新20ish子类。

我尝试打开一个新的会话和事务,并在完成后关闭它们,但是当我的方法回到业务方法时,我收到会话已关闭的错误。我试图不关闭会话并提交事务,但这也无效。

现在我正在使用它,一切似乎都在本地正常工作:

session = HibernateSessionFactory.getSession();
tx = session.getTransaction();

我只是关闭会话并回滚错误。我只是不确定getSession是否总会返回已经打开的会话。我是否可以假设每个线程一次只能打开一个会话?

以下是getSession的实现:

Session session = (Session) threadLocal.get();

    if (session == null || !session.isOpen())
    {
        if (sessionFactory == null)
        {
            rebuildSessionFactory();
        }
        session = (sessionFactory != null) ? sessionFactory.openSession() : null;
        threadLocal.set(session);
    }

    return session;

谢谢!

1 个答案:

答案 0 :(得分:2)

根据我的理解,getSession将返回一个新的hibernate会话。在Hibernate中有两种使用会话的方法,描述了文档中的事务模式:https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch02.html

数据库的实际“会话”取决于您与数据库的连接。大多数人使用连接池,如C3P0,可用于确保会话重用并加快代码速度。

我使用的最佳结构是在应用程序启动时创建一次SessionFactory,因为这会将连接池设置为数据库。然后,利用单个模式来保持单个SessionFactory,为您从单个SessionFactory执行的每个事务请求新会话。 Hibernate将利用底层连接池来处理会话重用,以实现速度和优化。