一次将1000多条记录保存到数据库中

时间:2009-06-11 16:53:22

标签: nhibernate ado.net batch-processing

我目前正在使用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);
}

当有大量的记录需要保存时,这显然非常非常繁重,不得不多次访问数据库。什么是更好的方法?我可以做一些批量更新吗?我最好使用DataSet吗?

由于

5 个答案:

答案 0 :(得分:14)

设置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();
    }
    

答案 1 :(得分:5)

我相信这就是你要找的东西:

Bulk Data Operations With NHibernate's Stateless Sessions

基本上不是打开ISession,而是打开IStatelessSession,在你的hibernate.cfg.xml中你可以设置:

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

答案 2 :(得分:3)

我认为根据您的具体情况,您有多种选择。

如果你可以使用NHibernate 2.1 alphas,你可以尝试使用可用的新的可执行HQL。

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

托比亚斯的回答也会奏效。只需设置批量大小即可显着提高性能。

如果你想用ADO.Net弄脏你的手......

通过使用Sql批量复制,可以在Sql Server中进行批量插入。

这方面的一个例子是:http://dotnetslackers.com/articles/ado_net/SqlBulkCopy_in_ADO_NET_2_0.aspx

对我而言,您似乎正在基于数据库中的另一个实体创建一个新实体。对我而言,这似乎是使用存储过程的理想方案。

答案 3 :(得分:1)

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

如果要插入那么多记录并且插入非常简单,那么你应该看一下批量插入并拔出ORM。

答案 4 :(得分:1)

插入记录的最快方法是生成文本文件并使用LOAD FILE语法。大多数数据库都具有将数据文件导入数据库的非常快的实现。对于MySQL,请参见下文:

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

有关其他数据库,请参阅相应的手册。如果您经常插入一百万条记录或数千条记录,这将非常有用。否则,您可以做的最好的事情是创建一个包含1000个插入的大型SQL,并直接在数据库连接上执行该操作,跳过ORM及其相关验证。