我需要编写一个需要处理存储在数据库中的大量数据(10万条记录)的c#服务(可能是Windows服务或控制台应用程序)。 处理每条记录也是一项相当复杂的操作。作为处理的一部分,我需要执行大量插入更新。
我们使用NHibernate作为ORM。
一种方法是加载所有记录并按顺序处理它们......这可能会变得非常慢。 我正在研究多线程选项,并考虑让多个线程同时处理大量的记录。
任何人都可以给我一些关于如何处理这个问题的指示..考虑到我正在使用NHibernate以及可能出现的问题,比如死锁等等。
非常感谢。
答案 0 :(得分:2)
您应该考虑Task Parallel Library。
答案 1 :(得分:2)
假设您使用的是.NET 4.0,您可以使用任务并行库(如上所述)执行以下操作:
Parallel.ForEach(sourceCollection, item => Process(item));
您的源集合将是已加载记录的IEnumerable
。图书馆将为您处理一切:
对源集合进行分区,并根据系统环境在多个线程上调度工作。系统上的处理器越多,并行方法的运行速度就越快。
阅读a tutorial on using Parallel.ForEach()
可能有所帮助。另外,请注意potential pitfalls。
答案 2 :(得分:0)
听起来像PLINQ是最好的解决方案(Chapter 5 in this article)。但是,由于每个计算对数据库都有很多工作,因此您应该为每个线程创建单独的会话。
答案 3 :(得分:0)
尽可能使用IStatelessSessions并尝试使用adonet.batch_size属性。
还需要多高效的表现?我是NH的粉丝,但这是存储过程可能更好的一种情况