2011-03-10 15 views
3

我有一个Windows服务,它使用任务并行库(TPL)并行地执行大量任务。这将被扩展为处理与外部服务器上的SQL Server交互的任务。任务并行库和外部SQL服务器

TPL应该很擅长测量负载并为任务分配正确数量的并行线程。有没有办法让它知道加载到外部SQL Server实例?为本地服务器上的每个任务运行的实际代码非常小,但对数据库的调用可能很重。

我不可能最终与我的服务陷入数据库与请求,因为TPL发现本地服务器有大量的免费资源,或者是否有一种已知的方式来处理?

+0

如果有办法从并行任务中提取数据库交互,那将是您最好的选择。 – Steven 2011-03-10 12:14:28

+0

数据库交互是我想要并行执行的,因此将它解压缩为非并行执行将毫无意义... – 2011-03-10 13:10:54

+0

这并不意味着您必须完全顺序执行,但是在分离它时,你将拥有更多的控制权。 – Steven 2011-03-10 13:17:02

回答

3

TPL本身没有任何东西可以帮助你做到这一点。 TPL是关于管理/最大化本地应用程序的CPU负载。它不知道SQL负载,更不用说在另一台机器上。

也就是说,如果你想疯了,有一个扩展点叫做TaskScheduler。理论上,您可以在implement a custom TaskScheduler之间查看SQL服务器上的负载,并且只在该负载处于某个已定义的阈值时才安排要执行的任务。老实说,虽然我不认为这是解决问题的正确方案。针对共享资源(如SQL服务器)管理负载与TPL旨在解决的问题完全不同。如果你设计的应用程序不会通过加载测试来滥用SQL服务器,找到一个最佳位置并配置你的应用程序不会超出这些范围,那么你会更好。从那里,由您的DBA来决定SQL Server基础架构本身的正确解决方案,以管理该应用程序的需求以及任何其他外部负载。

-1

TPL擅长于对数据进行分区,就像测量负载一样,该任务是为您的操作系统来确定的(事实上它非常擅长)。因此,这更像是一个配置问题,然后是一个发展问题。 (您的SQL Server实例具有更高的优先级,那么您的服务?)。

0

如果您在客户端应用程序中并行执行数据访问功能,则会发现下一个瓶颈是SQL Server连接池。

+0

我不认为这将是一个问题,具体取决于硬件配置。然而,它同时运行多个SQL批处理是完全正常的。此外,这个问题似乎意味着已经有一个服务在并行地执行繁重的工作,而不是与SQL绑定 – Polity 2011-03-10 16:34:39