1

私は例外をいくらか理解していますが、それを解決する方法は理解していません。私の並行スレッドのほとんどは、SaveOrUpdateを使用して同じオブジェクトグラフをターゲットにします。その後、いつでも1つのセッションのみを開くことができますか?もしそうなら、どうすれば複数のスレッドにそれを強制できますか?

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());

                }
            }
        }
    }
4

1 に答える 1

0

NHibernateセッションはスレッドセーフではなく、論理的な結果として、データベース接続も一般的にはそうではありません。スレッドごとに1つのセッション(接続)が必要です。

于 2012-07-26T17:21:10.470 に答える