SQL Server CLR 线程

2023-11-22

我一直在与 SQL Server CLR 存储过程作斗争。

背景:

我们使用的是 SQL Server 2014,并且已经实现了一个 CLR 存储过程来调用客户的 Web 服务。

线程最初用于不减慢 SQL Server CLR 主线程的速度。

尽管现在我知道在 CLR 下使用线程并不是最好的主意,但它已经正常工作了 6 年(自 SQL Server 2008 以来)。最近它已经迁移到SQL Server 2014。

问题

在我的开发机器上,与测试系统上一样,我们的解决方案没有问题。

在客户系统上,调用 Web 服务的线程由于某种原因永远不会执行。

我可以从日志文件中看到,直到线程执行为止,一切都正常工作。

没有具体的错误,什么都没有。

我们一直在尝试更改权限,但没有成功。因此我认为这不是许可问题。

问题

  1. 有谁知道如何改变行为?我们找不到任何可以解决问题的配置。

  2. 完全删除线程并直接在 SQL Server 主线程上调用 Web 服务是个好主意吗?

谢谢您的任何建议, 彼得


不确定问题#1,但考虑到问题#2 的建议可能并不重要。尽管如此,SQL Server 2008(可以运行)和 SQL Server 2014(不能运行)之间的一个区别是 SQL Server 链接到的 CLR 版本。 SQL Server 2005 / 2008 / 2008 R2 链接到 CLR v2.0,而 SQL Server 2012 及更高版本链接到 CLR v 4.0。由于您没有看到该错误,而您的客户端却看到了该错误,因此我将确保他们的系统已更新到您正在运行的相同 .NET Framework 版本。

对于问题#2,我建议删除多线程。这有太多潜在的问题,需要大会UNSAFE。如果移除螺纹,则可以将装配设置为EXTERNAL_ACCESS.

如果要减少争用,则假设 Web 服务调用是针对同一 URI,则需要增加允许的并发 Web 请求数。这可以通过设置来完成ServicePointManager.DefaultConnectionLimit 属性。默认值为 2。这意味着,任何其他请求都将等待并等待,直到当前 2 个请求之一关闭。

另外,一定要正确Dispose of the WebRequest.


对可能无法快速完成的外部调用(即 Web 服务)的担忧是,SQL Server 使用协作多任务处理,其中每个线程负责在不同点将控制权“让渡”回调度程序(有效地暂停它),以便调度程序可以打乱事物的顺序并运行当前“睡眠”的其他事物。对于 SQLCLR 代码的这种担忧通常可以通过执行以下至少一项操作来缓解:

  • 执行数据访问/查询实例
  • Calling thread.sleep(0);

但是,外部调用并不是进行数据访问,不能轻易调用thread.sleep(0)在等待的同时WebResponse去完成。是的,您可以在单独的线程上调用 WebService,并在等待它完成时(假设您只是循环并检查)sleep(x)将允许产量。

但是异步调用 Web 服务是否有必要呢?它当然有一个缺点,即要求将程序集标记为WITH PERMISSION_SET = UNSAFE。这很大程度上取决于呼叫通常需要多长时间以及呼叫的频率。调用越频繁,任何延迟就越有可能(至少部分是由每个 URI 允许的并发连接数较低的默认值引起的)。这与我在上面提出的建议有关。

但如果您想了解 SQL Server 的实际工作原理,测试起来应该相当容易。在我的笔记本电脑上,我转到对象资源管理器中的服务器“属性”,转到“处理器”,取消选中“自动设置处理器关联性...”选项,在树视图中的“处理器关联性”下仅选择一个 CPU在对话框中间,单击“确定”,然后重新启动服务。然后我设置了一个网页,除了调用“睡眠”60 秒之外什么也不做。我有一个调用网页的 SQLCLR TVF,因此我在两个不同的选项卡/会话中同时运行它。在第三个选项卡/会话中,我运行了:

SELECT SUM(so1.[schema_id]), so1.[type_desc], so2.[type_desc]
FROM sys.objects so1
CROSS JOIN sys.objects so2
CROSS JOIN sys.objects so3
CROSS JOIN sys.objects so4
CROSS JOIN sys.objects so5
WHERE so3.[create_date] <> so4.[modify_date]
GROUP BY so1.[type_desc], so2.[type_desc], so5.[name]
ORDER BY so2.[type_desc], so5.[name] DESC;

最后,在第四个选项卡中,启动前 3 个选项卡后,我运行以下命令来监视系统:

SELECT * FROM sys.dm_os_schedulers WHERE [scheduler_id] = 0;

SELECT *
FROM sys.dm_exec_requests
WHERE [scheduler_id] = 0
AND [status] <> N'background'
ORDER BY [status] DESC, session_id;

运行 SQLCLR 函数的 2 个会话的状态始终为“正在运行”,而运行选项卡 3 中丑陋查询的会话的状态始终为“可运行”。但可以肯定的是,当两个 SQLCLR 函数均未执行时,再次运行该丑陋的查询所花费的时间与与对正在休眠的网页运行 SQLCLR 调用的 2 个会话同时运行时所花费的时间相同60 秒。

请不要推断有no运行 SQLCLR 代码以进行 Web 调用的成本。由于这些线程一直很忙,如果系统很忙,那么 SQL Server 分配这些线程以更快地完成其他查询的能力就会降低。但似乎确实可以得出这样的结论:至少在低负载到中等负载的系统上,通过添加线程获得的好处似乎不值得增加复杂性的成本(特别是因为现在有一个尚未重现的需要调试的问题)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server CLR 线程 的相关文章

随机推荐

  • System.InvalidOperationException:无法将发行版 docker-desktop 部署到 :退出代码:-1

    我正在尝试在我的 Windows 10 Local 中运行 docker Desktop 已成功安装 但在运行时出现以下错误 System InvalidOperationException Failed to deploy distro
  • Heroku 上使用 Node.js 的代理服务器

    我正在尝试使用 http proxy 在 Heroku 上的 Node js 上构建一个代理服务器 本地一切工作正常 但我在 Heroku 上遇到了一些麻烦 var http require http var httpProxy requi
  • 如何在 SQL Server 中创建是/否布尔字段?

    创建一个的最佳实践是什么yes no i e Boolean从转换时的字段access database或者一般情况下 等价的是一个BIT field In SQL你用0 and 1设置位字段 就像 Access 中的是 否字段一样 在 M
  • Django 中间件错误 - 中间件已更改为 1.7

    每当我使用 Django 项目运行本地服务器时 我都会收到一条警告和一条错误消息 指出在 Django 1 7 中 全局中间件类已更改 即使我使用的是 1 8 我的博客 位于http 127 0 0 1 8000 加载正常 但是当我尝试加载
  • 如何在镜头式单板库中为更高种类的类型实现孔和上下文?

    安德拉斯 科瓦奇提出了这个问题回应之前问题的答案 在镜头式单板库中 用于存储各种类型 gt 基于班级 class Uniplate1 f where uniplate1 Applicative m gt f a gt forall b f
  • 如何反转包含代理对的字符串

    我写了这个方法来反转字符串 public string Reverse string s if string IsNullOrEmpty s return s TextElementEnumerator enumerator StringI
  • 在 Ruby 中提取字符串中的所有 url

    我有一些文本内容 其中包含 URL 列表 我正在尝试抓取所有 URL 并将它们放入一个数组中 我有这个代码 content Here is the list of URLs http www google com http www goog
  • 将 Unix 时间戳转换为无时区时间戳

    如何将 Unix 时间戳 或纪元时间 转换为 PostgreSQLtimestamp without time zone 例如 1481294792应该转换为2016 12 09 14 46 32 I tried SELECT to tim
  • Ruby:比较级之间有什么区别:“||”和“或”[重复]

    这个问题在这里已经有答案了 可能的重复 Ruby 之间的区别和 或 使用红宝石 and or 是非常常见的做法 因此了解两者之间的区别很重要 因为不幸的是我不确定 首先我的问题是以下假设是否正确 EX1 if variable 1 vari
  • 返回值 javascript UIWebView

    我正在尝试获取 javascript 函数的返回值 例如 return hello 与 iPhone SDK 在 OS X 上的 WebView 方法 stringByEvaluatingJavaScriptFromString返回一个包含
  • Swagger UI 显示驼峰命名法参数而不是 PascalCase

    我在 Asp Net Core 3 1 API 中使用 NewtonSoft json 和 Swashbuckle AspNetCore 版本 5 3 3 默认情况下 在 Asp Net Web API 中 2 个输入和输出参数的大小写为
  • 在 C 中为 Fortran 数组分配内存

    我是 Fortran 编程新手 我有一个 3 维数组 声明如下 REAL 4 DIMENSION ALLOCATABLE a1 我想通过引用 C 或 C 函数来传递数组 并在 C 中而不是在 Fortran 中分配内存 是否有可能或者我对
  • Dart 中的 Object 语法意味着什么?

    在下面的代码示例中 从颤振文档 class RandomWords extends StatefulWidget override createState gt RandomWordsState class RandomWordsState
  • 在 WPF 中显示 RichTextBox 中的行号

    我找到了一个例子 如何显示行号RichTextBox在 Windows 窗体中 http www codeproject com Articles 38858 Line Numbers for RichText Control in C 有
  • R Shiny 中的环境

    At http shiny rstudio com articles scoping html闪亮范围的规则得到了很好的解释 有 3 个相互嵌套的环境或级别 函数内 会话内和所有会话内可用的对象 使用 如果我在会话中定义变量但想在函数中更改
  • 登录后重新加载 AntiForgeryToken

    在同一页面的另一个视图中成功登录后 我需要在视图中的表单中重新加载 AntiForgeryToken 我可以通过 jQuery 使用结果登录页面中的新密钥在表单输入 Html AntiForgeryToken 密钥中进行更新吗 如果是 这是
  • 用于 SRT 字幕的 Java API [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有没有SRT字幕的Java API 实际的SRT解析是通过Java能够操作的正则表达式来执行的 实际的正则表达式是 protected static
  • 使用 allauth 绕过注册表单

    有谁知道在 django allauth 中使用社交帐户时如何绕过注册页面 我已经与 Google 合作进行身份验证 但是当用户接受 Google 的请求时 它会重定向到一个页面 要求他们输入电子邮件地址 然后才能登录 但它肯定会从 Goo
  • SqlCommand.Prepare 方法要求所有参数都具有显式设置的类型

    我的 WCF Web 服务中有以下代码片段 它根据提供的字典值的格式构建一组 where 条件 public static Dictionary
  • SQL Server CLR 线程

    我一直在与 SQL Server CLR 存储过程作斗争 背景 我们使用的是 SQL Server 2014 并且已经实现了一个 CLR 存储过程来调用客户的 Web 服务 线程最初用于不减慢 SQL Server CLR 主线程的速度 尽