2017-03-28 10 views
2

我有一个CLR DLL(使用C#编写的源代码),它被加载到SQL Server中。初始化过程很昂贵,所以我通常只想做一次。但是,有时可能需要重新初始化,我不想重新启动SQL Server来完成此操作。因此,我有而不是将这些静态变量标记为只读。我的问题是,我的静态变量以看似随机的方式重置为null。我非常有信心,我没有任何线程问题,并且我的代码无论如何都将这些值设置为null。通过分析我的日志文件,我只能猜测SQL Server以某种方式将值重置为空(有时可能重新加载DLL?)。 SQL Server是否这样做?如果是这样,有没有办法配置它不?SQL Server CLR静态变量设置为空

+3

该描述与SQLCLR函数或聚合应该是几乎相反。 SQLCLR类使用SQL Server的线程在SQL Server的内存空间内运行。它的生命周期由SQL Server控制。因此它*不应该执行昂贵的初始化,也不需要它。它*不应该*有静态变量。它*不应该*浪费可以用来缓存数据的内存。换句话说,你确实有线程问题,但这些可能是你问题最少的部分 –

+2

代码在哪里,它想做什么?为什么SQLCLR组件需要任何类型的初始化?除了注意到SQLCLR类并不意味着以这种方式工作以外,不可能在没有代码的情况下提供帮助 –

+0

此代码涉及到密钥管理器以导出加密密钥。我将密钥缓存在内存中,以便不必重复地访问密钥管理器(因为这是昂贵的过程)。不幸的是,我不允许发布这个特定项目的任何代码。 – Hmmmmm

回答

2

SQL Server按照它认为合适的方式加载和卸载CLR模块(在内存压力下,在未处理的异常情况下,more on it here)。即使你能够找出所有相关的条件和时机,这在未来的版本中也可能会发生变化。

保持大量的数据不会很好地扩展。为此编写一个Windows服务,并通过tcp从您的托管UDF中调用它(例如)。如果您确实需要进程内状态,请使用持久性缓存机制而不是静态变量(数据库,文件系统) - 或者预计静态可随时变为空,每当它发生时重新初始化它们,没有任何问题采用这种方法本身,除了可伸缩性问题和并发/同步。