【问题标题】:Get Problems with sessions and multithreading (NHibernate Version 2)获取会话和多线程问题(NHibernate 版本 2)
【发布时间】:2020-01-14 04:52:47
【问题描述】:

我们有一个旧软件并使用 NHibernate 版本 2 和 Oracle DB。我更改了一些部分,以便该软件现在具有多线程。更改后,我遇到了多线程和会话对象的问题(因为会话对象不是线程安全的)。 所以我更改了创建会话的 SessionMananger 类。从数据库中检索数据总是会创建一个新会话session = SessionFactory.OpenSesion()。 存储数据时,会话对象将被存储并重用,直到提交或回滚。提交后会话对象将被关闭。

解决方案有效,但有时我们会遇到不同的错误,例如 ORA-03135 或无法执行选择查询。

是否可以打开会话并且不要显式关闭此会话。还是会话会自动关闭?

是否可以将会话对象存储在以线程 ID 作为键的线程安全字典中?

【问题讨论】:

    标签: c# multithreading session nhibernate sessionfactory


    【解决方案1】:

    为每个线程创建一个会话并在 ConcurrentDictionary 中保护该会话,其中线程 ID 作为键,会话作为值。当需要会话时,应用程序检查是否为特殊线程创建了会话。如果没有,将创建一个新会话。

    bool success = _DictThreadSession.TryGetValue(Thread.CurrentThread.ManagedThreadId, out session);
    
    if (!success)
    {
        //create session and run some stored procedures
        session = CreateSession();
        _DictThreadSession.TryAdd(Thread.CurrentThread.ManagedThreadId, session);
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      相关资源
      最近更新 更多