我们如何编写一个高性能和SAFE SQLCLR程序集来创建和放置一个json对象在MSMQ中?

时间:2017-01-16 15:45:50

标签: sql-server json msmq sqlclr

我正在处理的其中一个项目中有一个要求,我需要创建并以JSON格式从SQL Server向MSMQ传递一些事件消息。

我发现SQL CLR可能是实现此目的的最佳方式。但是,我的一些同事说,它在性能和内存利用方面都很昂贵。

我正在寻找最大20 msg / sec的基准。 消息数取决于数据库中发生的某些事件。 实施需要运行~10小时/天。

请建议如何实现它。代码段/步骤将是一个很大的帮助。

随时欢迎任何其他实现此功能的选项。

感谢。

1 个答案:

答案 0 :(得分:1)

  

我发现SQL CLR可能是实现此目的的最佳方式。但是,我的一些同事说,它在性能和内存利用方面都很昂贵。

有很多"它取决于"在这次谈话中。而且,您听到的大多数性能/内存/安全问题都是基于错误信息或简单缺乏信息。

SQLCLR代码可能效率低下,但在某些情况下,它也可能比T-SQL更高效/更快。这一切都取决于你要完成什么,你如何解决问题,无论是在整体结构还是如何编码方面。对于可以在直接T-SQL中完成的事情,它在直接T-SQL中几乎总是更快。但是如果你将T-SQL代码放在标量函数/ UDF中,那么它就不再快了;-)。内联T-SQL是最快的,如果您可以实际执行您想要做的事情。

因此,如果您可以通过T-SQL与MSMQ进行通信,那么就这样做。但是,如果你不能,那么是的,SQLCLR可以足够有效地处理这个问题。

HOWEVER#1,关于JSON的需求:

我不认为任何supported .NET Framework libraries包含JSON支持(但我需要再次检查)。虽然尝试加载Json.NET很有诱惑力,但是在该代码中正在进行某些编码实践,这些实践在SQLCLR中使用是不明智的,即使用静态类变量。 SQLCLR是一个共享的应用程序域,因此运行相同代码的所有会话将共享相同的内存空间。因此,Json.NET代码不应该按原样使用,需要进行修改(如果可能)。有些人走了简单的路线,只是将程序集设置为UNSAFE以传递有关无法使用未标记为readonly的静态类变量的错误,但这可能导致奇数/意外行为所以我不推荐它。可能还会引用不受支持的.NET Framework库,这些库需要以UNSAFE的形式加载到SQL Server中。所以,如果你想做JSON,你可能需要construct it manually

然而#2,问题标题是(强调添加):

  

我们如何编写高性能和 SAFE SQLCLR程序集来在MSMQ中创建和放置json对象?

在标记为SAFE的程序集中,您无法与SQL Server之外的任何内容进行交互。您需要将程序集标记为EXTERNAL_ACCESS以便与MSMQ进行通信,但不应该构成任何固有问题。