CLR 过程可以打开一个端口并监听它吗?

Can a CLR procedure open a port and listen on it?

我想要一个 clr 过程,当被调用时打开一个 udp 端口​​来侦听传入的数据。它永远不会 returns 给调用者。调用者将超时设置为无限。 MSSQL 服务器会允许吗?

这是一个判断电话。我想说最决定性的因素是套接字保持打开状态的时间。如果它的长度为 "transactional",并且系统之间的差异很大 - 那么我会说这很好。我没有看到集群有任何问题,因为 SQL 服务器没有 Active/Active 集群(但 NLB 肯定有可能)。另一个决定因素是套接字是否是单实例(监听 non-broadcast 端口)。

所以,是的,如果:

  • 将从 T-SQL(SQL 服务器代理或 SSRS?)调用 function/stored 过程
  • function/stored 过程预计将在 "transaction" 时间段内退出
    (我会说 30 秒是典型的 - 但在高负载系统上,一个获取锁然后等待 30 秒的调用可能是该死的,所以你需要考虑你的用例。)
  • 函数可重入(可以运行多次并行)

否如果:

  • 该函数是从 C# 或其他功能更强大的客户端调用的(您在那里进行处理 - 也许是一个库?)
  • 函数将等待一段不确定的时间,远远超过典型的事务长度
  • 该函数是单实例的(只有一个会话才能成功执行该函数)

考虑几个说明差异的示例:

一个 SQL 服务器代理作业,它每天使用从大型机抓取的速率图表填充 table。

安装了一个 CLR 函数,它获取 XML 抓取文件,连接到主机并使用 TN 3270 屏幕抓取 return result-set 中指定的形状 XML 文档

  • 必须从 SQL 调用(以便于维护和故障报告)
  • 如果超过设定的超时时间(~30s)应该超时
  • 可以运行在多个会话中并行
  • 答案: SQL CLR 函数
  • 的一个很好的候选者

一个 "Ticker" 应用程序,其中一个应用程序侦听价格更新的 UDP 广播,并且 return 将结果集作为流式结果集发送到客户端

一个 CLR 函数打开一个 UDP 广播侦听端口并将结果异步写回客户端。这一直持续到达到应用程序定义的结束条件(特定数据包有效负载、查询取消或超时)

  • 必须从 SQL 调用以处理混合平台(某些客户端在 PHP 上 Linux,其他客户端在 Windows 上的 VB6)
  • 具有已定义且用户可控的超时(但部分未通过此测试,因为它可能会超过事务持续时间)。
  • 可以运行在多个会话中并行(广播)
  • 答案: SQL CLR 函数
  • 的 "ok" 候选项

将接收到的事件转储到 table

的系统日志服务器

在 0.0.0.0:514 和 returns 事件上打开 UDP 侦听器作为流式结果集的函数。

  • 没有真正的理由必须从 SQL 调用它,因为它缓冲到 table 而不管
  • 没有超时 - 预计 运行 24/7
  • 调用应用程序(SQL 服务器代理)必须确保此函数始终只执行一次并在失败时重新启动它(服务管理器的重新实现)
  • 答案:不适合SQL CLR,考虑Service Broker + NT Service