【发布时间】:2011-02-12 05:52:10
【问题描述】:
问题背景
我一直在考虑如何优化 SQL Server 中会话的状态外存储,我遇到的一些方法是:
- 在不需要会话的页面上禁用会话状态。此外,在不写入会话的页面上使用只读。
- 在 ASP.NET 4.0 中使用 gzip 压缩选项。
- 尽量将会话中存储的数据量保持在最低限度。
- 等
现在,我在会话中存储了一个对象(一个名为 SessionObject 的类)。好消息是,它是完全可序列化的。
使用 protobuf-net 进行优化
我认为另一种可能是优化会话存储的好方法是使用协议缓冲区(protobuf-net)序列化/反序列化而不是标准 BinaryFormatter。我知道我可以让我的所有对象都继承 ISerializable,但我不想创建 DTO 或使用序列化/反序列化逻辑弄乱我的域层。
任何使用带有会话状态 SQL 服务器模式的 protobuf-net 的建议都会很棒!
【问题讨论】:
-
仅供参考,Gzip 压缩与会话和会话存储无关。如果您将 SQL 服务器用于会话状态,那么几乎没有理由将会话用于状态,因为您在会话中存储的大部分信息都在您的数据库中。因此,如果您仍然有要保存到会话的状态并且您正在遵循您的第 3 点,那么您要保存到会话中的是什么? SessionObject 的属性也是如此吗?
-
另外,我会在应用程序级别(在 web.config 文件中)设置会话状态,然后为特定页面打开或只读,这样您就不必记住打开关掉它。
-
@Shiv - 我非常不同意你在第一条评论中的观点;在过去,我见过很多使用会话状态来处理瞬态数据的例子个人 写了一个基于 gzip 的会话状态提供程序,以帮助减少网络 IO。它工作得很好,并且显着提高了性能。
-
@Marc,从他谈到 gzip 的方式来看(至少对我而言)似乎并不意味着使用 gzip 来压缩会话状态,而是使用 gzip 来压缩响应,所以我说它有与会话状态无关(他试图优化的东西)。当然压缩会话状态应该有助于 I/O 带宽的使用。至于你的另一点。我确实说过,“大部分情况下”,我确实要求澄清。
-
就我个人而言,我尽可能远离会话状态。当我在非常繁忙的站点(300 个请求/秒及更多)上查看 IIS 中的挂起请求时,我发现所有挂起的请求都处于“获取会话状态”状态。取消会话状态(并使用 cookie 和/或隐藏字段)不会留下挂起的请求。就个人而言,我从来不需要保存(在会话状态下)任何无法从数据库中获取的东西。再说一次,我不是说没有必要,但也许重新思考可能会导致没有必要?这是我最初评论的重点。
标签: asp.net session session-state protocol-buffers protobuf-net