首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ISession包装器的IStatelessSession

使用ISession包装器的IStatelessSession
EN

Stack Overflow用户
提问于 2011-09-09 17:11:13
回答 1查看 1.7K关注 0票数 2

我已经将NHibernate会话包装在我自己的IDataContext中。我的NHibernate实现如下:

代码语言:javascript
复制
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时,我会这样注册:

代码语言:javascript
复制
// 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。

我会很感激你的帮助。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-12 05:01:14

IStatelessSession的行为与ISession有很大的不同:

无状态会话不实现一级缓存,也不与任何二级缓存交互,也不实现事务性写后或自动脏检查,也不将操作级联到关联的实例。集合被无状态会话忽略。通过无状态会话执行的操作绕过了NHibernate的事件模型和拦截器。由于缺少一级缓存,无状态会话容易受到数据别名效应的影响。

你可以通过周期性地调用ISession.Clear来对抗一级缓存膨胀,比如每500个加载的对象。否则,你可以创建一个新的“上下文”(但要为意外的行为做好准备)。

代码语言:javascript
复制
public class NHibernateStatelessDataContext : IDataContext {
    private readonly IStatelessSession _session;
    ...
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7359432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档