我正在开发一个使用Hibernate3和JDBC连接/与我们的数据库交互的项目(MSSQL 2008)
目前我们在主类中创建会话工厂,然后开始我们的事务,然后我们启动一个新线程,该线程创建连接,什么不是。我会看看我是否可以用一些伪代码来说明这一点......
public static main(String[] args){
for(...){
SessionFactory sf = new SessionFactory();
sf.getCurrentSession.beginTransaction();
CreateNewThreadedObject.run();
sf.getCurrentSession.getTransaction.commit();
}
}
我的问题是,这样安全吗?我知道会话不是线程安全的,但我并没有在线程中使用会话。如果有什么我正在使用交易。将sessionfactory传递给线程对象会更好吗?任何建议表示赞赏!
答案 0 :(得分:5)
了解Hibernate会话和线程关联非常重要,最好在这里解释一下:
http://community.jboss.org/wiki/Sessionsandtransactions
如果您正在使用网络应用,我强烈推荐以视图模式开放会话:
答案 1 :(得分:3)
您可以初始化单个SessionFactory。这实际上是推荐的。
然后,每个线程应使用会话工厂创建一个会话并执行事务。
这实际上是Web应用程序中常用的模式。 @kvista提到的Open Session in View模式基本上是一个servlet过滤器,它创建一个会话,开始一个事务,委托任何继续请求处理,最后提交或回滚事务。由于每个请求都由servlet容器中的不同线程处理,因此您可以看到这两个案例的接近程度。
在您的情况下,在每个线程中执行许多事务并不是不合理的。这实际上是在多线程(理想情况下为JTA)环境中执行批处理的基本思想。但是,您应该注意的一点是,会话实际上是一个充当缓存的持久性上下文,您可能应该不时清除它以避免内存泄漏。