0

Castle Active RecordとNHibernateを使用しており、セッションを使用せずにHQL更新を実行できる必要があります。セッションを使用すると、ロックの問題が発生します。

public static ISession GetSession(out ISessionFactoryHolder factoryHolder, out bool created)
        {
            created = false;
            var type = typeof(T);
            factoryHolder = ActiveRecordMediator.GetSessionFactoryHolder();
            ISessionScope activeScope = factoryHolder.ThreadScopeInfo.GetRegisteredScope();
            ISession session = null;
            var key = factoryHolder.GetSessionFactory(type);
            if (activeScope == null)
            {
                created = true;
                session = factoryHolder.CreateSession(type);
            }
            else
            {
                if (activeScope.IsKeyKnown(key))
                    session = activeScope.GetSession(key);
                else
                    session = factoryHolder.GetSessionFactory(type).OpenSession();
            }
            return session;
        }

        public static void UpdateQuery(string query)
        {
            ISessionFactoryHolder factoryHolder;
            var created = false;
            var session = GetSession(out factoryHolder, out created);
            session.CreateQuery(query).ExecuteUpdate();
            if (created)
                factoryHolder.ReleaseSession(session);
        }

これは、セッションから発生するすべてのロックが原因で、本番環境で重大な問題を引き起こしています。セッションをインスタンス化せずにhql更新を実行するにはどうすればよいですか?

4

1 に答える 1

0

NHibernate セッションの外で HQL を実行することはできません。ただし、ステートレス セッションを使用すると役立つ場合があります (ActiveRecord で StatelessSessionScope を使用します)。

または、ステートレス セッションのパフォーマンスがまだ十分でない場合は、session.CreateSqlQuery(...) を使用して、単純な SQL を使用してクエリを実行する必要があります。

于 2012-06-07T17:34:09.443 に答える