我正在为客户开发一个网站(ASP.NET,T-SQL)。它是一个数据输入网站,允许他们的许多用户登录和操作同一数据库中的记录。
整个表单中都有说明(基本上是字符串列表),告诉用户每个部分要做什么;这些说明本身就存在于数据库中。
在每次登录时,我将这些指令存储在每个经过身份验证的用户的Session []对象中。每个人的说明都是相同的。
我已经查看了一个解决方案,该解决方案建议在数据库中存储一个公共会话标识符,然后查询它以重新使用该特定会话,但这似乎非常hacky。什么是实现这一目标的最佳实践解决方案?是否有可供所有用户使用的“通用”对象?
答案 0 :(得分:4)
首先,此时此重要吗?是的,这是不好的做法,但是如果你在内存中存储20Kb的字符串并且最多有100个用户,那就是2,000Kb的数据。几乎没有很多记忆“浪费”。即使是200Kb的字符串,也就是20,000Kb的数据。再一次,不是很多。你现在值得花时间和客户等你解决吗?
如果您决定,那么您可以:
Application
对象或静态类中,以便它们被检索一次并多次使用。答案 1 :(得分:2)
听起来像你正在寻找应用程序缓存。与会话一样,它是内存中的数据缓存。与会话不同,它在所有用户之间共享;每个用户都没有获得他们自己的数据副本。此外,当您向缓存添加数据元素时,您可以指定自动使该数据无效的条件,并使其重新加载/刷新(当您的很少更改的数据确实发生更改时非常有用)。
这里有一些文章可以为您提供有关使用应用程序缓存(以及ASP.NET中的一些其他缓存选项)所需的一切信息:
答案 2 :(得分:1)
我建议使用应用程序级别的Cache对象。它随处可见,作为HttpContext的一部分。您可以在App_Start上填充它。
您可以将任何类型的对象放入缓存中,但显然,越小越好。
以下是如何使用C#填充它的一些示例:
1)将项目添加到缓存中,就像通过指定项目的键和放置项目一样将项目添加到字典中。值。
示例:将文本框的当前Value
属性添加到缓存中。
Cache["txt1"] = txtName.value;
或
Cache["result"] = dataset;
2)Insert
方法重载,允许您为正在使用的版本的参数定义值。
示例:仅添加项目键和&值:
Cache.Insert(“MyData1”,connectionString);
3)Add
方法与Insert方法具有相同的签名,但它返回一个表示您添加的项目的对象。
Cache.Add("MyData1", connectionString);
要检索来自缓存:
stringName = Cache["MyData"];
如果缓存的数据不是字符串,则可能需要将其强制转换为正确的数据类型。
result = (DataSet)Cache["result"];
使用Cache对象而不是Application对象的一个好处是,如果系统存在内存不足的危险,CLR将转储Cache的内容。