我想将 OleDbConnection 对象存储在具有 mode="StateServer" 或 mode="sqlserver" 的会话中,但在尝试此操作时我收到错误,它说 - 无法序列化会话状态。在状态服务器和 sqlserver 模式下,asp.net 将序列化会话状态对象,因此不允许使用不可序列化的对象或 MarshalByRef。
想要序列化数据库连接是没有任何意义的。这样的资源本质上是不可序列化的,因此无法保存在会话中。
在会话中存储数据库连接使用 InProc 会话模式,因为它仅存储对对象的引用,而其他每个会话模式都使用序列化:以特定格式将公共属性写入文件或数据库。这不会保留网络连接。
只需不要在会话中存储数据库连接,您就会没事的。不要重新发明已经存在的称为"连接池"的轮子。您不需要自己执行此操作。
这是设计的行为。出于充分的理由,DbConnection
实现没有标记为Serializable
- 最重要的是打开的连接包含非托管的带电套接字或管道句柄。
从应用程序设计的角度来看,在会话中存储实时连接是没有意义的。此外,在请求之间保持连接打开状态可能会降低性能。数据库连接是池化的,创建和打开新连接将在内部重用池中的现有连接(如果配置正确(,因此这是为每个请求打开/关闭一个连接的最有效和推荐的方法。
如果出于某种原因具有依赖于会话的连接,请存储连接字符串(或指向一组连接的索引(,而不是实际的连接对象。
另请参阅:
https://stackoverflow.com/a/2738199/1132334,
https://forums.asp.net/t/1790135.aspx?SQL+connection+best+practices