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)。

或者,如果无状态会话仍然不够高效,您将不得不使用简单的 SQL 执行查询,使用 session.CreateSqlQuery(...)

于 2012-06-07T17:34:09.443 回答