【问题标题】:Is it wrong to store DataTable in Cache?将DataTable存储在Cache中是错误的吗?
【发布时间】:2011-03-03 22:51:20
【问题描述】:

我见过很多人将 DataTables 存储到缓存中的例子,但我只是想知道,同样的规则是否适用于适用于 Session 的缓存?我最关心的一条规则是:

不要将不可序列化的对象存储到 Session 中。仅仅因为你可以并不意味着它一定会起作用(我很难学到这一点)。

所以最终我的问题是:

您可以将不可序列化的对象存储到缓存中吗?

我对此进行了一段时间的研究,阅读了许多帖子,甚至阅读了我的 ASP.NET 3.5 书中有关缓存的章节,但我在任何地方都找不到。

由于我有疑问,我打算将我的 DataTable 放入 DataSet 中,然后放入 Cache,但这有必要吗?

谢谢。

【问题讨论】:

    标签: asp.net caching serialization datatable


    【解决方案1】:

    Cache 一直在使用机器的内存,Session 使用已经配置好的内存:

    在网络场中,Session 可以是本地的(仅在设置了关联性时才有效),也可以是远程的(状态服务器或数据库,或自定义),但缓存始终是本地的。

    所以,在缓存中存储一​​个DataTable会消耗内存,但不会使用序列化。

    PS:存储 DataSet 而不是 DataTable 几乎不会发生任何变化。

    【讨论】:

    • +1 表示“存储数据集而不是数据表几乎不会改变任何事情”
    • 感谢您的回复并为我解惑。这是一个相关的问题。是否不赞成将数据存储在缓存变量中,如下所示:“Cache [Session.SessionID + “variableName”] = object”。这里的目标是避免在会话中存储不可序列化的对象(我使用 SQL Server 进行会话管理),同时也避免多个会话操作该对象。这是一种不好的做法吗?
    • @dyslexicanaboko - 缓存仅用于快速访问实际存储在其他地方的数据。它不应该是给定数据的唯一存储。为什么?因为它可以随时被 ASP.NET 出于某种原因(内存、cpu 等...)清空。缓存访问应始终采用以下形式:如果(数据不在缓存中)则(从存储中读取数据,缓存,返回)。
    • 在我的情况下,我使用它进行分页,所以如果用户搜索与他们正在查看的内容不同的内容,通常情况下数据将被更改 - 当时。谢谢你的提示。
    【解决方案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
    

    我已经多次在缓存中使用它们而没有问题。根据我的经验,更大的问题是缓存中的数据量。

    【讨论】:

    • 很抱歉我没有查到那个...我必须把这个给我的一位同事看,所以我们不再有这个争论了。我的印象是它不可序列化,因为我的一位同事告诉我它不是,但我应该查一下。谢谢你让我明白这一点。
    【解决方案3】:

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

    您通常使用缓存来存储文件、数据结果集、对象...不经常更改、加载或计算繁重且请求频繁,这样可以提高应用程序性能。

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

    【讨论】:

    • 我最近了解到这一点,因为我不经常将东西存储在 Session 或 Cache 中,因为当我这样做时,我的上级会很生气。显然,在某些情况下不使用 Session 或 Cache 是不可避免的,但我犯了一个大错误,认为 Cache 不是应用程序范围的,我在调试一些不能正常工作的东西时发现了这一点。
    猜你喜欢
    • 2010-11-04
    • 2021-01-26
    • 2022-01-05
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    相关资源
    最近更新 更多