当前位置:  开发笔记 > 编程语言 > 正文

什么是SQL Server CLR集成生命周期?

如何解决《什么是SQLServerCLR集成生命周期?》经验,为你挑选了1个好方法。

如何在SQL Server中管理CLR(.NET)对象?

SQL Server中任何CLR代码的入口点都是静态方法.通常,您只会创建该方法范围内的对象.但是,您可以设想在静态成员中存储对象的引用,让它们转义方法调用范围.如果SQL Server在多个存储过程/函数调用中将这些对象保留在内存中,那么它们对于缓存应用程序可能很有用 - 尽管它们也更危险.

SQL Server如何处理这个问题?它甚至允许(非方法)静态成员吗​​?如果是这样,它在记忆中保留了多长时间?在每次CLR呼叫之后垃圾收集所有内容吗?它如何处理并发?



1> Triynko..:

在Robin Dewson和Julian Skinner的"Pro SQL Server 2005 Assemblies"中,它说"像其他数据库对象一样加载到数据库中的程序集由数据库用户拥有.同一个数据库中同一用户拥有的所有程序集都将运行在同一AppDomain中.由不同用户拥有的程序集将在单独的AppDomain中运行."

这告诉我的是,如果你有一个单一的数据库和所有组件工作加载在CREATE ASSEMBLY语句具有相同的所有者,那么你的组件将全部在同一个应用程序域中运行.但是,在同一个AppDomain中并不意味着使用相同的代码库,因此即使相同的dll也可以多次加载到同一个应用程序域中,即使它们具有相同的名称,它们的类型也不会匹配.当同名类型来自不同的代码库时,它们的静态变量也将是不同的实例.

我可以看到在具有多个程序集的SQL Server CLR环境中安全地使用静态变量的唯一方法是实际上只使用单个程序集.您可以将ILMerge实用程序与"UnionMerge"选项一起使用,将所有程序集打包为一个并合并具有相同名称的类.这应该保证对于给定的数据库,在您的单独程序集中,您的静态变量将像在独立应用程序中一样工作.我认为可以安全地假设应用程序域没有在每次请求时卸载和重新加载,但是你不能依赖它永远不会被卸载,因为只要有未处理的错误就会发生这种情况(至少如果它在不安全的模式下运行) ).

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有