在会话中存储我的自定义类的 1000 多个实例的列表是不是存在内存问题?

Posted

技术标签:

【中文标题】在会话中存储我的自定义类的 1000 多个实例的列表是不是存在内存问题?【英文标题】:Is storing List of 1000+ instance of my custom class in session a memory problem?在会话中存储我的自定义类的 1000 多个实例的列表是否存在内存问题? 【发布时间】:2011-04-20 22:56:33 【问题描述】:

将我的自定义类的 1000 个实例的列表存储到会话变量中是一种好方法吗?我的 asp.net 网络应用程序需要多语言支持,我将标签存储在一个表格中。我将有多个用户,他们有自己的语言偏好和文本(标签内容)偏好。

我正在考虑加载标签并将其存储在会话变量中并访问它以在页面中使用。将其存储在应用程序变量中不起作用,因为每个客户都有自己的标签文本。所以存储会话是一个好方法这样做的方式?我想我现在将拥有近 1000 个标签,并且可能会随着应用程序的增长而增加。

我的自定义类有 2 个属性。语言代码和语言名称

由于某种原因我不能使用 asp.net 资源文件:(

您对此有何看法?

【问题讨论】:

我建议您找出不能使用 RESX 文件的“原因”,因为它们就是为此而设计的。 【参考方案1】:

您应该为每种语言存储一组标签,然后将语言名称存储在会话中并使用它来查找正确的标签集。

【讨论】:

SLaks,谢谢。但我对“查找正确的标签集”感到困惑?我正在根据用户的语言偏好加载我的标签类列表(LanguageCode、LangugeText)。您是说通过“查找”来在会话变量中搜索语言文本吗? 您应该维护一个将 LanguageCode 映射到标签文本的字典。然后,您可以在字典中查找用户当前语言的标签文本集。 我应该在哪里存储字典?在会话或应用程序中? 在静态字段中。 (字典不应该改变)【参考方案2】:

如果我是你,我会先花一些时间试图弄清楚为什么你的资源文件不工作......只要你将 Thread.CurrentThread.CurrentCulture(或者它是 CurrentUICulture?)值设置为特定的文化,并且将资源文件放在正确的位置,我想不出它为什么不起作用的任何原因。

【讨论】:

经理出于某种原因不想使用资源文件。他们想管理表格中的标签。【参考方案3】:

不是个好主意,有两个问题:

会耗尽服务器内存,减少可以使用系统的用户数 每个请求的时间都会增加

执行此操作的标准方法是使用 RESX(资源)文件。你应该尝试解决这个问题。

【讨论】:

【参考方案4】:

为什么不使用应用程序变量并创建与您拥有的语言一样多的应用程序变量。每个应用程序变量都是该语言所有标签的超集。 或者可能将整个表存储在应用程序变量中,而不是存储多个会话变量,我假设它们彼此相交。

【讨论】:

【参考方案5】:

需要注意的一些想法:

如果您的经理特别反对 resx,您可以将所有这些标签存储为任何其他格式(例如纯文本文件)或数据库中。

如果您的用户数量很少,而且加载时间非常关键,那么您的经理可能会说得通。除此之外,他们错了,我会考虑尝试向他们解释这一点。

尝试考虑在运行时“计算”标签(例如,如果其中一些包括添加前缀、后缀等。您可以只保存“词干”并仅按需提供相关标签。这将为您节省一些服务器空间)。

【讨论】:

以上是关于在会话中存储我的自定义类的 1000 多个实例的列表是不是存在内存问题?的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 类的自定义方法

Summernote - 多个编辑器实例上的自定义按钮

为 Spring 会话和自定义数据使用不同的 Redis 数据库

Tomcat 7/JBoss7 的自定义会话 ID 生成器

从 Kentico 10 中的自定义表重复器中过滤重复的列值

在 opsworks 中的自定义 json 中设置环境变量