2011-09-09 18 views
2

我在自己的IDataContext中包裝了NHibernate會話。我的NHibernate實現的,這是如下:使用ISession包裝的IStatelessSession

public class NHibernateDataContext : IDataContext { 
    private readonly ISession _session; 

    public NHibernateDataContext(ISession session) { 
     _session = session; 
     Begin(); 
    } 

    public IRepository<T> Repository<T>() where T : class { 
     return new NHibernateRepository<T>(_session); 
    } 

    public void Begin() { 
     if (!_session.Transaction.IsActive) 
      _session.BeginTransaction(); 
    } 

    public void Commit() { 
     if (_session.Transaction.IsActive) 
      _session.Transaction.Commit(); 
    } 

    public void Dispose() { 
     _session.Close(); 
    } 
} 

public class NHibernateRepository<T> : IRepository<T> where T : class { 
    private readonly ISession _session; 

    public NHibernateRepository(ISession session) { 
     _session = session; 
    } 

    public IQueryable<T> GetAll() { 
     return _session.Query<T>(); 
    } 

    public T GetByID(int id) { 
     return _session.Get<T>(id); 
    } 

    public void Insert(T entity) { 
     _session.SaveOrUpdate(entity); 
    } 

    public void Delete(T entity) { 
     _session.Delete(entity); 
    } 
} 

使用微軟統一然後我說註冊此:

// Configure the container 
container.RegisterType<ISessionFactory>(new ContainerControlledLifetimeManager(), new InjectionFactory(c => { 
    return CreateSessionFactory(); 
})); 
container.RegisterType<ISession>(new InjectionFactory(c => { 
    var sessionFactory = container.Resolve<ISessionFactory>(); 
    return sessionFactory.OpenSession(); 
})); 
container.RegisterType<IDataContext, NHibernateDataContext>(new PerRequestLifetimeManager<IDataContext>()); 

到目前爲止好,但我的應用程序需要產生一些大的報告。我發現它們由於第一級緩存膨脹而呈指數級下降。我瞭解IStatelessSession界面允許我這樣做。

如何重構我的應用程序,以便在查詢某些數據時可以輕鬆使用IStatelessSession而不是ISession?請注意,對於每個請求,我仍然希望打開一個ISession,但只有在需要ISessionlessSession時纔會打開。

我會很感激的幫助。由於

回答

3

IStatelessSession行爲顯著不同的Isession:

一個無狀態session不實現第一級cache,也不 與任何二級緩存交互,也不實施 事務後寫或自動髒檢查,也不會將操作級聯到關聯的實例。 無狀態會話忽略集合。通過無狀態會話執行的操作 繞過NHibernate的事件模型和攔截器。由於缺少一級緩存,無狀態會話 容易受到數據混疊效應的影響。

您可以定期撥打ISession.Clear來打擊一級緩存腹脹,比方說每500個加載的對象。否則,您可以創建一個新的「上下文」(但要爲意外行爲做好準備)。

public class NHibernateStatelessDataContext : IDataContext { 
    private readonly IStatelessSession _session; 
    ... 
}