使用线程的Hibernate会话和事务

时间:2011-01-13 20:26:10

标签: java multithreading hibernate session-variables

我正在开发一个使用Hibernate3和JDBC连接/与我们的数据库交互的项目(MSSQL 2008)

目前我们在主类中创建会话工厂,然后开始我们的事务,然后我们启动一个新线程,该线程创建连接,什么不是。我会看看我是否可以用一些伪代码来说明这一点......

public static main(String[] args){
    for(...){
        SessionFactory sf = new SessionFactory();
        sf.getCurrentSession.beginTransaction();
        CreateNewThreadedObject.run();
        sf.getCurrentSession.getTransaction.commit();
    }
}

我的问题是,这样安全吗?我知道会话不是线程安全的,但我并没有在线程中使用会话。如果有什么我正在使用交易。将sessionfactory传递给线程对象会更好吗?任何建议表示赞赏!

2 个答案:

答案 0 :(得分:5)

了解Hibernate会话和线程关联非常重要,最好在这里解释一下:

http://community.jboss.org/wiki/Sessionsandtransactions

如果您正在使用网络应用,我强烈推荐以视图模式开放会话:

https://community.jboss.org/wiki/OpenSessionInView

答案 1 :(得分:3)

您可以初始化单个SessionFactory。这实际上是推荐的。

然后,每个线程应使用会话工厂创建一个会话并执行事务。

这实际上是Web应用程序中常用的模式。 @kvista提到的Open Session in View模式基本上是一个servlet过滤器,它创建一个会话,开始一个事务,委托任何继续请求处理,最后提交或回滚事务。由于每个请求都由servlet容器中的不同线程处理,因此您可以看到这两个案例的接近程度。

在您的情况下,在每个线程中执行许多事务并不是不合理的。这实际上是在多线程(理想情况下为JTA)环境中执行批处理的基本思想。但是,您应该注意的一点是,会话实际上是一个充当缓存的持久性上下文,您可能应该不时清除它以避免内存泄漏。