【问题标题】:Hibernate Sessions and Transactions with Threads休眠会话和事务与线程
【发布时间】:2011-06-08 18:21:36
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您在衍生线程中使用事务(以便线程执行的操作可以是在 main 中启动的事务的一部分),那么这可能会失败,因为主事务可以在衍生线程之前提交它完成其工作单元

标签: java multithreading hibernate session-variables


【解决方案1】:

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

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

如果您使用的是 Web 应用程序,我强烈建议您使用 Open Session in View 模式:

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

【讨论】:

  • 这不是一个网络应用,它更像是一个巨大的文件解析器:D
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2012-06-29
    相关资源
    最近更新 更多