首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一次将1000+记录保存到数据库

一次将1000+记录保存到数据库
EN

Stack Overflow用户
提问于 2009-06-11 16:53:22
回答 5查看 15.8K关注 0票数 12

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

代码语言:javascript
运行
复制
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会更好吗?

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-11 16:54:52

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

为此,您必须

NH configuration中的

  • set adonet.batch_size

示例:

代码语言:javascript
运行
复制
    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服务器){session.SaveOrUpdate(服务器);} tx.Commit();}

票数 16
EN

Stack Overflow用户

发布于 2009-06-11 19:21:20

我相信这就是你要找的:

Bulk Data Operations With NHibernate's Stateless Sessions

本质上不是打开一个ISession,而是打开一个IStatelessSession,然后在hibernate.cfg.xml中设置:

代码语言:javascript
运行
复制
 <property name="adonet.batch_size">100</property>
票数 5
EN

Stack Overflow用户

发布于 2009-06-11 17:14:42

我认为你有很多选择,这取决于你的情况。

如果你可以使用NHibernate 2.1Alpha,你可以尝试使用新的可用的可执行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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/982295

复制
相关文章

相似问题

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