我有一个 Windows 服务,它使用任务并行库 (TPL) 并行执行大量任务。这将被扩展以处理与外部服务器上的 SQL Server 交互的任务。
TPL 应该擅长测量负载并将正确数量的并行线程分配给任务。有没有办法让它知道外部 SQL Server 实例的负载?在本地服务器上为每个任务运行的实际代码非常小,但对数据库的调用可能非常繁重。
我的服务是否不太可能因请求而导致数据库停滞不前,因为 TPL 发现本地服务器有大量免费资源,或者是否有已知的方法来处理这个问题?
最佳答案
TPL 没有什么可以帮助您解决这个问题。 TPL 是关于管理/最大化本地应用程序的 CPU 负载。它不知道 SQL 负载,更不用说在另一台机器上了。
就是说,如果您想变得疯狂,有一个名为 TaskScheduler
的扩展点。 .理论上你可以 implement a custom TaskScheduler
它可以监视 SQL 服务器上的负载,并且仅在负载达到某个定义的阈值时才安排任务执行。
老实说,我认为这不是解决问题的正确方法。针对 SQL 服务器等共享资源管理负载与 TPL 旨在解决的问题完全不同。您最好确保您设计的应用程序不会通过负载测试自行滥用 SQL 服务器,找到最佳点并配置您的应用程序不会超出这些范围。从那里开始,您的 DBA 将需要为 SQL Server 基础架构本身确定正确的解决方案,以管理该应用程序的需求以及任何其他外部负载。
关于c# - 任务并行库和外部 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5258656/