所以我正在开发一个没有多线程的应用程序。我们有一个主业务逻辑方法,可以打开这样的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;
谢谢!
答案 0 :(得分:2)
根据我的理解,getSession将返回一个新的hibernate会话。在Hibernate中有两种使用会话的方法,描述了文档中的事务模式:https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch02.html
数据库的实际“会话”取决于您与数据库的连接。大多数人使用连接池,如C3P0,可用于确保会话重用并加快代码速度。
我使用的最佳结构是在应用程序启动时创建一次SessionFactory,因为这会将连接池设置为数据库。然后,利用单个模式来保持单个SessionFactory,为您从单个SessionFactory执行的每个事务请求新会话。 Hibernate将利用底层连接池来处理会话重用,以实现速度和优化。