如何设置NHibernate使用Spring.Net进行无状态会话?

时间:2010-02-18 10:34:57

标签: c# nhibernate spring.net

我目前正在开发一个从文件中读取大量数据的应用程序。要插入db中的一批对象的通常大小约为40.000个对象。到目前为止,我们已经使用Spring.Net和NHibernate进行开发,我希望尽可能保持一致,并使用相同的技术进行批量插入。我有NHibernate的经验,我知道使用无状态会话是可能的。

有没有办法使用Springs.Net事务和会话管理但使用NHibernate无状态会话?使用有状态会话不是一个具有如此大量对象的选项,我真的想使用NHibernate而不是Spring.Net ADO

4 个答案:

答案 0 :(得分:3)

您可以构建自己的HibernateTransactionManager,以创建两种类型的会话。这几乎没有开销,因为Sessions的创建成本很低。

从Spring.NET源代码树中获取该类的副本。当它为常规ISession执行此操作时,它是否打开并关闭IStatelessSession。将您的IStatelessSession放入Spring.Threading.HybridContextStorage以便于访问。

然后在需要IStatelessSession的类上创建方法或扩展方法GetStatelessSession。

或者,如果您使用的是SQL Server,使用SqlBulkCopy可能会更好。

答案 1 :(得分:2)

您可以在会话工厂中使用OpenStatelessSession方法。

public class Foo : HibernateDaoSupport
{
    public void Bar()
    {
        using (var session = SessionFactory.OpenStatelessSession())
        {
            // do something with the stateless session
        }
    }
}

答案 2 :(得分:0)

事务在ISession和IStatelessSession中以相同的方式工作。我不知道Spring.Net是做什么来支持NHibernate的,但是如果IStatelessSession还没有被支持那么它应该不难实现。

答案 3 :(得分:0)