为了简单起见,这里是我正在尝试做的一个例子:
我用 C# 编写的 CLR 库(它是线程安全的,即使我没有在示例中显示它):
public static class MySP {
private static Session _session;
[Microsoft.SqlServer.Server.SqlProcedure]
[SqlFunction]
public static void Send(string destination, string message)
{
if(_session == null)
_session = new Session();
_session.SendMessage(destination, message);
}
}
编译后,我将其导入我的 SQL Server(使用 Microsoft SQL Server Management Studio):
CREATE ASSEMBLY [MyDLL] FROM 'C:\MyDLL.dll' WITH PERMISSION_SET = UNSAFE;
GO
我导入存储过程:
CREATE PROCEDURE sp_Send (@DestinationName nvarchar(256), @MessageString nvarchar(max))
AS EXTERNAL NAME MyDLL.[NS.MySP].Send
GO
最后,我有一个调用存储过程的 SQL 脚本:
EXEC sp_Send "MyDestination","MyMessage"
GO
现在的问题是:每次我调用存储过程(如上所示)时,都会创建一个新的 Session 对象(我知道,因为我看到在另一端打开了多个 TCP 连接)。
如何阻止 SQL Server 多次加载我的库,以便它实际执行“静态”对象范例?我只希望创建单个“会话”,直到 SQL Server 进程终止,而不是每次调用存储过程时都创建一个静态对象。
谢谢你。
更多细节(不确定它们是否有必要):我的“会话”对象是从另一个库加载的(所以我在技术上加载了 2 个 DLL,但在上面的示例中只显示了一个以保持简单),然后依次包装(并加载)一个本机 DLL,不确定此信息是否相关,但我想我会添加它。
编辑:我还想补充一点,如果我在同一个 SQL 脚本中多次调用我的存储过程,则会创建一个 Session 对象。每次我用多个存储过程调用调用该脚本时,都会创建一个新的 Session 对象。