CLR过程可以打开端口并进行监听吗?

时间:2019-06-28 21:20:07

标签: sql-server udpclient

我希望有一个clr过程,该过程在调用时会打开udp端口以侦听传入的数据。它永远不会返回给调用者。呼叫者的超时设置为无限。 MSSQL服务器会允许吗?

1 个答案:

答案 0 :(得分:1)

这是一个判断电话。我要说的最决定性的因素是插座保持打开状态的时间。如果它的“事务性”长度在系统之间差异很大,那么我会说这很好。我没有看到群集的任何问题,因为SQL Server没有Active / Active群集(但是NLB肯定有可能)。另一个决定因素将是套接字是否是单实例(在非广播端口上侦听)。

所以,如果是这样,

  • 该函数/存储过程将从T-SQL(SQL Server代理或SSRS?)中调用
  • 功能/存储过程预计将在“交易”时间段内退出
    (我会说典型的情况是30秒-但在高负载的系统上,调用先锁定然后等待30秒的调用可能会很麻烦,因此您需要考虑用例。)
  • 该函数是可重入的(可以并行运行多次)

否,如果:

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

考虑一些说明差异的示例:

SQL Server代理作业,每天使用从大型机上抓取的费率图表填充表。

已安装CLR函数,该函数获取XML抓取文档,连接到大型机,并使用TN 3270屏幕抓取以XML文档中指定的形状返回结果集

  • 必须从SQL中调用(以简化维护和故障报告)
  • 如果超过设置的超时时间(〜30s),则应该超时
  • 可以在多个会话中并行运行
  • 答案:SQL CLR函数的理想人选

“ Ticker”应用程序,其中应用程序侦听价格更新的UDP广播,并将结果集作为流式结果集返回给客户端

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

  • 必须从SQL中调用以处理多种平台(Linux上的PHP上的某些客户端,Windows上的VB6上的其他客户端)
  • 具有定义的且用户可控制的超时(但部分无法通过此测试,因为它可能会超过交易持续时间)。
  • 可以并行(广播)在多个会话中运行
  • 答案:SQL CLR函数的“确定”候选人

将接收到的事件转储到表中的系统日志服务器

一个函数,该函数在0.0.0.0:514上打开UDP侦听器并返回事件作为流结果集。

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