我使用SQL Server 2008和C#作为CLR存储过程。有没有办法在内存中保留一个大对象,并在第二次调用存储过程后检索此对象?
在第二次调用中,我需要尽快检索这个大对象的数据。这个对象就像一张桌子。
如果没办法,我正在考虑序列化。或者我正在考虑自己实施一些方法来加速这个过程。你觉得怎么样?
谢谢!
答案 0 :(得分:1)
最简单的方法是将其序列化到某个文件。我不会把它保存在内存中,因为你没有任何关于何时清除这个记忆的钩子。
这里有一些关于文件访问的帖子:
http://social.msdn.microsoft.com/Forums/en-US/sqlnetfx/thread/45b46ce0-a4b3-45d0-86ec-1c1638fb7cb2
如果这是一个类似于表的结构,那么另一个简单且可能足够快的方法是创建一个临时表,CLR可以使用数据读取器选择该表。就个人而言,我会走这条路,并证明它在走其他路线之前还不够快。
答案 1 :(得分:1)
在sql server中将对象存储在内存中的唯一方法是将其放在静态字段中。这可以工作,但是这样做需要编写一些相对棘手的代码来确保它是线程安全的并且正确地管理生命周期。在sql server下,clr appdomain可以在任何时间点卸载和重新生成,因此必须小心谨慎。对于同一个程序集同时存在多个appdomains的可能性,但在ddl操作期间处理不同的查询请求。
Adam Machanic编写了article关于使用静态字段作为缓存的一些含义,以及与此相关的安全隐患和最佳实践。