我目前正在使用 NHibernate。我遇到一种情况,我需要将一堆记录保存到数据库中,如下所示:

var relatedTopics = GetRelatedTopics(topic);
foreach (var relatedTopic in relatedTopics /* could be anywhere from 10 - 1000+ */)
{
    var newRelatedTopic = new RelatedTopic { RelatedTopicUrl = relatedTopic, TopicUrl = topic.Name };
    _repository.Save(newRelatedTopic);
}

当有大量记录需要保存时,必须多次访问数据库显然是非常费力的。什么是更好的方法?我可以做某种批量更新吗?我使用数据集更好吗?

谢谢

有帮助吗?

解决方案

设置 adonet.batch_size 可以改善这种情况。

为此你必须

  • 在 NH 配置中设置 adonet.batch_size

例子:

    m_sessionFactory = Fluently
         .Configure()
         .Database(MsSqlConfiguration
             .MsSql2005
             .ConnectionString(c => c.FromConnectionStringWithKey("testme"))
             )
         .Mappings(m => m.FluentMappings
             .AddFromAssemblyOf<TestImpl>())
         .ExposeConfiguration(config =>
         {
             config.SetProperty("adonet.batch_size", "1");
             m_configuration = config;
         })
         .BuildSessionFactory();
  • 在保存之前设置会话的批量大小

    using (ISession session = m_nhibernateSessionFactory.GetSession())
    using (var tx = session.BeginTransaction())
    {    
       session.SetBatchSize(1000);     
       foreach (var server in serverz)
       {
          session.SaveOrUpdate(server);
       }
       tx.Commit();
    }
    

其他提示

我相信这是你在找什么:

散装数据操作使用NHibernate的无国籍访问

本质,而不是打开一个ISession,你打开一个IStatelessSession,并把hibernate.cfg.xml您可以设置:

 <property name="adonet.batch_size">100</property>

我认为你必须根据自己的情况有多种选择。

如果你可以使用NHibernate的2.1阿尔法,你可以尝试使用新的可执行HQL这是可用的。

http://nhibernate.info/blog /2009/05/05/nh2-1-executable-hql.html

Tobias的答案也能发挥作用。只需设置批量大小将增加体面的性能。

如果您想弄脏手与ADO.Net ...

在SQL服务器这样的批量插入通过使用SQL批量复制是可能的。

的那一个例子是在这里: http://dotnetslackers.com/articles/ado_net/ SqlBulkCopy_in_ADO_NET_2_0.aspx

要我好像你正在创建基于关闭数据库中的另一实体的一个新实体。对我来说,这似乎是一个理想的方案中使用的存储过程。

数据集?没有。 批量插入?是。

如果你插入很多记录和刀片是很简单的,你应该看看做批量插入和拔出ORM。

要插入记录的最快方法是生成一个文本文件,并使用LOAD文件语法。大多数数据库非常快实现,以导入数据文件导入数据库。对于MySQL,见下文:

http://dev.mysql.com/doc /refman/5.1/en/load-data.html

对于其他数据库,参考相应的手册。如果要插入一百万条记录,或记录数千频繁,这非常有用。否则,你能做的最好的就是创建一个大的SQL与插入的1000和直接执行你的数据库连接上,跳过奥姆斯及其相关的验证。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top