2011-03-03 69 views
1

我见过很多人将DataTables存储到缓存中的例子,但我只是想知道,适用于Session的Cache是​​否也适用相同的规则?在一个规则,我最关心的是:将DataTable存储在缓存中是否是错误的?

不可序列化对象不要存储到会话中。仅仅因为你可以并不意味着它就能保证工作(我从中学到了这一点)。

所以,最后我的问题是:

你能不可序列化对象存储到缓存?

我reasearched这一段时间,阅读了许多帖子,甚至阅读有关缓存的章节中我的ASP.NET 3.5的书,我不能在任何地方找到它。

由于我在怀疑,我打算把我的DataTable到DataSet,然后到缓存中,但这个必要吗?

谢谢。

回答

2

缓存是始终使用机器的内存,会话使用什么样已被配置:

在Web场会话可以是本地(其中只有亲和力设置有效),或远程(状态服务器或数据库或自定义),但缓存始终是本地的。

所以,在高速缓存中存储的DataTable会消耗内存,但它不会使用序列化。 PS:存储一个DataSet而不是一个DataTable将几乎没有改变。

+0

+1“用于存储数据集而不是数据表将不会发生什么变化” – David 2011-03-03 22:59:53

+0

感谢您的回复,并为我解决这个问题。这是一个相关的问题。它不喜欢将数据存储在Cache变量中,如下所示:“Cache [Session.SessionID +”variableName“] = object”。这里的目标是避免在会话中存储不可序列化的对象(我正在使用SQL Server进行会话管理),但也避免多个会话操纵该对象。这是一种不好的做法吗? – dyslexicanaboko 2011-03-06 02:42:07

+0

@dyslexicanaboko - 缓存仅用于快速访问实际存储在其他位置的数据*。它不应该是给定数据的唯一存储空间。为什么?因为它可以随时由ASP.NET出于某种原因清空(太多的内存,CPU等)。缓存访问应始终采用以下形式:if(数据不在缓存中)然后(从存储读取数据,缓存数据,并返回数据)。 – 2011-03-06 07:10:24

2

的DataTable是可序列化这样的关注并不在此情况下,从网页挂到了顶部申请... http://msdn.microsoft.com/en-us/library/system.data.datatable(VS.71).aspx

[Visual Basic] 
<Serializable> 
Public Class DataTable 
    Inherits MarshalByValueComponent 
    Implements IListSource, ISupportInitialize, ISerializable 
[C#] 
[Serializable] 
public class DataTable : MarshalByValueComponent, IListSource, 
    ISupportInitialize, ISerializable 

我用它们在高速缓存中多次没有问题。根据我的经验,更大的关注点是缓存中的数据量。

+1

我很抱歉,我没有看,最多......我要展示给我的同事之一,所以我们没有这个说法了。我的印象是它不是可序列化的,因为我的同事告诉我它不是,但我应该查看它。谢谢你让我知道。 – dyslexicanaboko 2011-03-06 02:26:39

0

缓存和会话之间的区别在于缓存对应用程序是公开的,这意味着缓存对登录到应用程序的所有用户都是可见的,但对于会话,每个用户都有自己的会话实例因此在会话中缓存的数据在多个用户中将不可见。

您可以使用缓存通常是存储文件,数据结果不经常更换套,对象...,重加载或计算,并要求经常这样,你提高了应用程序的性能。

最后,是的,您可以将不可序列化的对象存储在缓存中。

+0

我最近了解到,因为我不经常在会话或缓存中存储事物,因为我的上司在我做这些事情时会变得非常小心。显然,在某些情况下,不使用会话或缓存是不可避免的,但是我认为缓存不是应用程序范围时犯了一个大错误,我在调试那些效果不佳的东西时发现了这一点。 – dyslexicanaboko 2011-03-06 02:28:52