代码之家  ›  专栏  ›  技术社区  ›  Eugene Ryzhikov

如何确保从同一线程调用的方法使用相同的DB会话

  •  2
  • Eugene Ryzhikov  · 技术社区  · 15 年前

    在我们的系统中,我们有多线程处理引擎。在处理过程中,每个线程调用方法从数据库检索数据。我们确定,如果从同一线程调用的方法使用相同的DB会话(当然,会话来自池),那么性能将得到极大的提高。

    更新:忘了提到相同的方法可以在不同的上下文中调用,它们应该使用从池中获取会话的标准方法

    4 回复  |  直到 15 年前
        1
  •  2
  •   Kannan Ekanath    15 年前

    在你的问题中我没有看到春天。所以我假设您需要一个简单的实用程序来实现这一点。

    class SessionUtil {
        private ThreadLocal currentSession;
    
        public Session getCurrentSession() {
            if(currentSession.get() == null) {
                 Session s = //create new session
                 currentSession.set(s);
            }
            return (Session)currentSession.get();
        }
    }
    

        2
  •  2
  •   Bozho    15 年前

    Spring有一个叫做 TransactionSynchronizationManager . 它存储当前数据 Session 在一个 ThreadLocal . 这个 不建议开发人员使用,但您可以尝试使用它。

    Session session = ((SessionHolder) 
       TransactionSynchronizationManager.getResource(sessionFactory)).getSession();
    

    EntityManager ,只需将“会话”替换为“EntityManager”)。

    你可以有 sessionFactory 注入到bean中-它是每个应用程序的。

    this 讨论。

        3
  •  0
  •   axtavt    15 年前

    Spring3.0有一个线程作用域bean的概念(hovewer,默认情况下不注册此作用域,请参阅文档): 3.5 Bean scopes , 3.5.5.2 Using a custom scope

    编辑 : 我要说的是:

    从Spring 3.0开始, 默认情况下未注册。更多 有关详细信息,请参阅文档 SimpleThreadScope . 对于 有关如何注册此文件的说明 或任何其他自定义范围,请参阅 Section 3.5.5.2, “Using a custom scope” .

        4
  •  0
  •   skaffman    15 年前

    Spring通过它的 Transaction Framework (实际上,使用 TransactionSynchronizationManager -见说明 here -但是你 真正地 我不想直接搞砸这件事,这太可怕了)。如果需要协调线程,那么这是迄今为止最简单的方法。

    然而,如何选择使用该框架取决于您自己。