SQL Server 2008中CLR中的线程处理

3
我有一个在SQL Server2008下运行的CLR进程。它构建了一些表格数据的缓存,在一个静态类中保存,以供其他调用稍后使用。
我的问题是,我是否可以通过生成线程来加载我的缓存中的每个数据集/表格来改善加载缓存的过程?
过去我一直避免这样做,因为各种帖子都建议将线程管理留给SQL Server。 但是,我真的需要加速这个过程。目前,它是一个顺序过程,逐个加载每个数据集。如果我可以并发地运行它们,那会非常方便。 这是我在CLR之外许多次做过的过程,以获得一些额外的性能提升。
非常感谢任何想法和提示。
2个回答

4
你可以使用线程,但它们必须表现良好。否则,您将失去使用它们的好处。
来自CLR主机环境 SQL Server和CLR如何共同工作 此部分讨论了SQL Server如何集成SQL Server和CLR的线程、调度、同步和内存管理模型。特别是,本节将在可伸缩性、可靠性和安全性目标方面考虑集成问题。当CLR托管在SQL Server中时,SQL Server实际上充当CLR的操作系统。CLR调用由SQL Server实现的低级别例程来进行线程、调度、同步和内存管理。这些是SQL Server引擎的其余部分使用的相同基元。这种方法提供了几个可伸缩性、可靠性和安全性方面的优点。
可伸缩性:共同的线程、调度和同步
CLR调用SQL Server API来创建线程,既可以运行用户代码,也可以用于自己的内部使用。为了在多个线程之间进行同步,CLR调用SQL Server同步对象。这使得SQL Server调度程序可以在线程等待同步对象时调度其他任务。例如,当CLR启动垃圾回收时,它的所有线程都会等待垃圾回收完成。因为CLR线程和它们正在等待的同步对象已知于SQL Server调度程序,所以SQL Server可以安排正在运行与CLR无关的其他数据库任务的线程。这也使得SQL Server能够检测到涉及CLR同步对象获取的锁的死锁,并采用传统的死锁移除技术。
托管代码在SQL Server中是抢占式运行的。SQL Server调度程序有能力检测并停止长时间没有让出CPU的线程。将CLR线程挂接到SQL Server线程意味着SQL Server调度程序可以识别CLR中的“runaway”线程并管理它们的优先级。这些runaway线程被暂停并放回队列。多次被识别为runaway线程的线程在一定时间内不允许运行,以便其他执行者可以运行。

0

静态数据在CLR调用中共享-不是一个好的计划: SQL Server文档

编程模型限制

在SQL Server中,托管代码的编程模型涉及编写函数、过程和类型,这些通常不需要跨多个调用保持状态或在多个用户会话之间共享状态。此外,正如前面所述,共享状态的存在可能导致影响应用程序可伸缩性和可靠性的关键异常。

考虑到这些因素,我们不建议在SQL Server中使用静态变量和类的静态数据成员。对于SAFE和EXTERNAL_ACCESS程序集,SQL Server在CREATE ASSEMBLY时检查程序集的元数据,并在发现使用静态数据成员和变量时失败创建这样的程序集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接