我已经将NHibernate会话包装在我自己的IDataContext中。我的NHibernate实现如下:
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);
}
}使用Microsoft Unity时,我会这样注册:
// 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,但只有在需要时才打开IStatelessSession。
我会很感激你的帮助。谢谢
发布于 2011-09-12 05:01:14
IStatelessSession的行为与ISession有很大的不同:
无状态会话不实现一级缓存,也不与任何二级缓存交互,也不实现事务性写后或自动脏检查,也不将操作级联到关联的实例。集合被无状态会话忽略。通过无状态会话执行的操作绕过了NHibernate的事件模型和拦截器。由于缺少一级缓存,无状态会话容易受到数据别名效应的影响。
你可以通过周期性地调用ISession.Clear来对抗一级缓存膨胀,比如每500个加载的对象。否则,你可以创建一个新的“上下文”(但要为意外的行为做好准备)。
public class NHibernateStatelessDataContext : IDataContext {
private readonly IStatelessSession _session;
...
}https://stackoverflow.com/questions/7359432
复制相似问题