我有一个CLR DLL(用C#编写的源代码),它被加载到SQL Server中。初始化过程很昂贵,所以我通常只想做一次。但是,有时可能需要再次初始化,我不想重新启动SQL Server来执行此操作。因此,我不将这些静态变量标记为只读。我的问题是我的静态变量以看似随机的方式重置为null。我非常有信心,我没有任何线程问题,并且我的代码都没有将这些值设置为null。通过分析我的日志文件,我只能猜测SQL Server是以某种方式将值重置为null(可能有时重新加载DLL?)。 SQL Server是否这样做?如果是这样,有没有办法将其配置为?
答案 0 :(得分:3)
SQL Server按其认为合适的方式加载和卸载CLR模块(在内存压力下,如果出现未处理的异常,more on it here)。即使您能够找出所有相关的条件和时间,这也可能在未来的版本中发生变化。
保留大量数据无法很好地扩展。为此编写Windows服务,并通过tcp从托管UDF中调用它(例如)。如果你真的需要进程内状态,使用持久缓存机制而不是静态变量(数据库,文件系统) - 或者预期静态可以随时变为空,无论何时发生重新初始化,都没有错使用此方法本身,除了可伸缩性问题和并发/同步。