SQLServerCLRThread一直在纠结于SQLServerCLR存储过程。背景:我们正在使用SQLServer2014并实现了调用客户Web服务的CLR存储过程。最初使用线程不会减慢SQLServerCLR的主线程。虽然,现在,我知道在CLR下使用线程不是最好的主意,但它已经工作了6年(自SQLServer2008以来)。它最近已迁移到SQLServer2014。问题在我的开发机器上,就像在测试系统上一样,我们没有解决方案的问题。在客户端系统上,调用Web服务的线程由于某种原因永远不会执行。我可以从日志文件中看到,在线程执行之前一切正常。没有具体的错误,没有。我们一直在尝试更改权限,但没有成功。所以我不认为这是一个权限问题。问题有谁知道如何改变这种行为?我们找不到任何可能有效的配置。完全删除线程并直接在SQLServer主线程上调用Web服务是个好主意吗?感谢您的任何建议,Peter不确定问题#1,但考虑到问题#2,建议可能无关紧要。尽管如此,SQLServer2008(它工作的地方)和SQLServer2014(它不工作的地方)之间的一个区别是SQLServer链接所针对的CLR的版本。SQLServer2005/2008/2008R2链接到CLRv2.0,而SQLServer2012和更新版本链接到CLRv4.0。由于您没有看到错误而您的客户端是,我会确保他们的系统已更新到您正在运行的相同.NETFramework版本。对于问题#2,我建议删除多线程。这有太多的潜在问题,需要大会是不安全的。如果线程被删除,程序集可以设置为EXTERNAL_ACCESS。如果要减少争用,则需要增加允许的并发Web请求数,假设Web服务调用属于同一URI。这可以通过设置ServicePointManager.DefaultConnectionLimit属性来完成。默认值为2。这意味着,任何其他请求都会等待并等待当前2之一关闭。另外,一定要正确处理WebRequest。对可能无法快速完成的外部调用(即Web服务)的关注是SQLServer使用协作式多任务处理,其中每个线程负责在不同点(有效地暂停它)将控制权返回给调度程序,以便调度程序可以随机播放和运行其他“休眠”的东西。您通常可以通过执行以下至少一项来减轻对SQLCLR代码的担忧:但是,外部调用不进行数据访问,并且您不能在等待WebResponse完成时轻松调用thread.sleep(0)。是的,您可以在单独的线程上调用WebService,当您等待它完成时,sleep(x)将允许yield,假设您只是循环和检查。但是否有必要异步进行Web服务调用?它当然有一个缺点,要求程序集被标记为WITHPERMISSION_SET=UNSAFE。很大程度上取决于通话通常需要多长时间以及通话频率。调用越频繁,任何延迟就越有可能至少部分地由每个URI允许的并发连接数的低默认值引起。这与我在顶部的建议有关。但如果您想了解SQLServer实际如何工作,那么这应该很容易测试。在我的笔记本电脑上,我转到对象资源管理器中的服务器“属性”,转到“处理器”,取消选中“自动设置处理器关联...”选项,并在树视图中选择单CPU下的“处理器关联”在对话框中间,单击“确定”,然后重新启动服务。然后,我设置了一个网页,除了调用“睡眠”60秒外什么都不做。我有一个调用网页的SQLCLRTVF,所以我在两个不同的选项卡/会话中同时运行它。在第三个选项卡/会话中,我运行了:SELECTSUM(so1.[schema_id]),so1.[type_desc],so2.[type_desc]FROMsys.objectsso1CROSSJOINsys.objectsso2CROSSJOINsys.objectsso3CROSSJOINsys.objectsso4交叉连接sys.objectsso5WHEREso3.[create_date]so4.[modify_date]GROUPBYso1.[type_desc],so2.[type_desc],so5.[name]ORDERBYso2.[type_desc],so5.[名称]描述;最后,在第4个选项卡中,在启动前3个选项卡后,我运行以下命令来监视系统:SELECT*FROMsys.dm_os_schedulersWHERE[scheduler_id]=0;SELECT*FROMsys.dm_exec_requestsWHERE[scheduler_id]=0AND[status]N'background'ORDERBY[status]DESC,session_id;运行SQLCLR函数的2个会话的状态始终为“正在运行”,并且在选项卡3中正在运行那个丑陋的查询会话的状态始终为“可运行”。但可以肯定的是,当两个SQLCLR函数都没有执行时,再次运行那个丑陋的查询执行的时间与运行SQLCLR调用的2个会话同时运行的时间相同1分14秒。持续60秒。请不要推断运行SQLCLR代码来进行Web调用是没有成本的。由于这些线程一直很忙,如果系统很忙,那么它会降低SQLServer分配这些线程以更快地完成其他查询的能力。但似乎可以肯定的是,至少在低到中等负载的系统上,通过添加线程获得的好处似乎不值得增加复杂性的成本(特别是因为现在调试问题尚未重现).以上就是C#学习教程:SQLServerCLR线程分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
