多线程;Hibernate异常,非法尝试将集合与两个打开的会话关联



我对异常有一定的了解,但不知道如何解决它。我的大多数并发线程都会使用SaveOrUpdate来针对同一对象图。那么,我可以在任何时候只开放一个会话吗?如果是这样,我如何在多个线程上强制执行它?

public class FnhManagerTS
{
    private static Configuration cfg;
    private static ISessionFactory sessionFactory;
    private static string connectionString;
    [ThreadStatic]
    private static ISession _session = null; 
    private FnhManagerTS() { }
    private static ISession OpenSession()
    {
        // Create a database connection and open a ISession on it.
        return sessionFactory.OpenSession();
    }
    /// <summary>
    /// ThreadStatic ISession.
    /// </summary>
    /// <returns></returns>
    public static ISession Session()
    {
        if (_session != null && _session.IsOpen)
            return _session;
        else
        {
            _session = OpenSession();
            return _session; 
        }
    }

回购:

public class GenericRepoTS<T>
    where T : class
{
    private ISession session;
    public GenericRepoTS()
    {
        this.session = FnhManagerTS.Session();
    } 
    public void SaveOrUpdate(IList<T> instances)
    {
        if (instances != null)
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                try
                { 
                    lock (instances)
                    {
                        foreach (var i in instances)
                        {
                            session.SaveOrUpdate(i);
                        }
                        transaction.Commit();
                    }
                }
                catch (Exception ex)
                {
                    transaction.Rollback(); 
                    Trace.TraceError("GenericRepository.SaveOrUpdate IList<" + typeof(T).ToString() + "> ", ex.ToString());
                }
            }
        }
    }

NHibernate会话不是线程安全的,根据逻辑推论,数据库连接通常也是如此。每个线程需要一个会话(连接)。

最新更新