目前的案例非常复杂,但我可以将其归结为这一点。我在 ConcurrentQueue<> 中有 300k 个对象(或更多,该数字仅用于统计),并且这些对象已准备好存储在数据库中。我使用了几个线程,在数据库中进行写入。当队列不为空时,每个线程都执行以下操作:
- 如果可以出队
- 拿一个物体
- 打开会话
- 开启交易
- 持久化对象
- 提交事务
- 关闭会话
- 转到 1。
经过一些测试有结果
- 2 个线程在 00:00:49.4008256 平均时间内持续处理 300k 个对象
- 4 个线程在 00:00:29.6146939 平均时间内持续处理 300k 个对象
- 10 个线程在 00:00:24.0903779 平均时间持续 300k 个对象
- 20 个线程在 00:00:19.7451293 平均时间内持续处理 300k 个对象
- 40 个线程在 00:00:18.2760453 平均时间内持续处理 300k 个对象
我的问题是:
[1] 为什么当我将线程数加倍时,执行时间没有减半?
[2] 无论如何在不增加事务中对象数量的情况下改进这一点。
我正在使用NHibernate 和 MSSQL 2012。