繁体   English   中英

使用线程的Hibernate会话和事务

[英]Hibernate Sessions and Transactions with Threads

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

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

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

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

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

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

如果您正在使用Web应用程序,我强烈建议您使用View模式打开会话:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM