2012-06-07 48 views
0

我正在使用Castle Active Record和NHibernate,並且需要能夠在不使用會話的情況下運行HQL更新。當我使用會話時,它最終導致鎖定問題:在AR和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更新?

回答

0

您不能在NHibernate會話之外執行HQL。但是你可能會發現使用無狀態會話會有所幫助(在ActiveRecord中使用StatelessSessionScope)。

或者,如果無狀態會話仍然沒有足夠的性能,您將不得不使用直接的SQL執行查詢,使用session.CreateSqlQuery(...)