我目前使用的是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会更好吗?
谢谢
发布于 2009-06-11 16:54:52
设置adonet.batch_size可以改善这种情况。
为此,您必须
NH configuration中的
示例:
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();}
发布于 2009-06-11 19:21:20
我相信这就是你要找的:
Bulk Data Operations With NHibernate's Stateless Sessions
本质上不是打开一个ISession,而是打开一个IStatelessSession,然后在hibernate.cfg.xml中设置:
<property name="adonet.batch_size">100</property>发布于 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
在我看来,您似乎是在基于数据库中的另一个实体创建一个新的实体。对我来说,这似乎是使用存储过程的理想场景。
https://stackoverflow.com/questions/982295
复制相似问题