在SQL Server 2008中处理对BeginExecuteNonQuery的多个调用

时间:2009-06-11 00:15:01

标签: sql-server asynchronous sqlcommand

我有一个应用程序正在接收我想要存储在数据库中的大量数据。我目前的策略是在每条记录准备就绪时触发异步调用(BeginExecuteNonQuery)。我正在使用异步调用来确保应用程序的其余部分顺利运行。

我遇到的问题是,随着数据量的增加,最终我到达了我正在尝试在连接仍然在使​​用时触发连接的命令。我可以看到两种可能的选择:

  1. 自己缓冲待处理数据,直到现有命令完成。
  2. 根据需要打开多个连接。
  3. 我不确定哪种选择最好,或者实际上有更好的方法。选项1可能会导致我的缓冲区越来越大,而选项2可能会非常糟糕 - 我只是不知道。

    任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

根据您的锁定策略,可能值得使用多个连接,但肯定不是“没有上限”的数字。因此,这里使用的一个好的策略/模式是"thread pool",N个专用线程中的每一个都持有一个连接,并在请求到来时接收写请求,并且线程完成它正在执行的前一个。通过在实际的实验/原型设置中对各种可能性进行基准测试,最佳性地确定池中用于获得最佳性能的线程数。

如果“缓冲区”队列(主线程在其中对写入请求进行排队并且池中的专用线程选择它们)超过某个阈值,则意味着您获得的数据速度超过了可能写出来的速度因此,除非您可以获得更多资源,否则您只需要删除某些输入数据 - 可能是通过随机抽样策略来避免对未来的统计分析产生偏差。只计算你写的多少以及由于每个时间段(比如每分钟左右)的资源短缺而需要减少多少,所以你可以在未来的数据挖掘探索中使用“分层抽样”技术

答案 1 :(得分:0)

谢谢Alex - 所以你建议使用混合方法,假设如果所有连接都在使用中,我仍然需要缓冲更新?

(我是原始海报,我刚刚设法得到两个帐户而没有意识到)