【问题标题】:how to serialize oledbconnection object c#如何序列化oledbconnection对象c#
【发布时间】:2017-03-24 10:30:25
【问题描述】:

我想将 OleDbConnection 对象存储在具有 mode="StateServer" 或 mode="sqlserver" 的会话中,但在尝试此操作时出现错误,即无法序列化会话状态。在 stateserver 和 sqlserver 模式下,asp.net 将序列化会话状态对象,因此不允许不可序列化的对象或 MarshalByRef。

【问题讨论】:

  • 这是个坏主意,不要这样做。数据库连接应尽可能短。使用它们并丢弃它们,不要将它们放置超过必要的时间。您唯一可行的选择是存储特定于用户的连接字符串。
  • 完全同意@Igor
  • @Igor 并非总是如此,对于某些用例的温暖的、随时可用的 连接有一些话要说。并不是说我保证它会进入一个会话
  • @MickyD - 我不同意,尤其是在你不知道下一个请求是否会进入的 asp.net 设置中(如果它有效,它可能会留下很多开放与周围的数据库的连接)。也是真的做不到。序列化是保存状态以供以后恢复的行为,但与数据库的打开连接不是以后可以捕获和恢复的。
  • 编写一个 Windows 服务来保持连接打开并加入 MTS 事务。然后使用 tcp、命名管道或共享内存在 ASP.NET 服务器端和该服务之间进行交互。使用 MTS 事务处理客户端 http 请求毫无意义。

标签: c# asp.net serialization oledbconnection


【解决方案1】:

想要序列化数据库连接是没有任何意义的。这样的资源本质上是不可序列化的,因此不能保存在会话中。

使用 InProc 会话模式在会话中存储数据库连接,因为它仅存储对对象的引用,而其他所有会话模式都使用序列化:以特定格式将公共属性写入文件或数据库。这不会保留网络连接。

只需不要在会话中存储数据库连接,就可以了。不要重新发明已经存在的称为“连接池”的轮子。您不需要自己执行此操作。

【讨论】:

    【解决方案2】:

    这是设计行为。 DbConnection 实现没有标记为 Serializable 有充分的理由 - 最重要的原因是打开的连接持有非托管的活动套接字或管道句柄。

    从应用程序设计的角度来看,在会话中存储实时连接是没有意义的。此外,跨请求保持连接打开可能会影响性能。数据库连接是池化的,创建和打开新连接将在内部重用池中的现有连接(如果配置正确),因此它是每个请求打开/关闭一个连接的最有效和推荐的方法。

    如果您 - 无论出于何种原因 - 有依赖于会话的连接,请存储连接字符串(或指向一组这些字符串的索引)而不是实际的连接对象。

    另请参阅:
    https://stackoverflow.com/a/2738199/1132334,
    https://forums.asp.net/t/1790135.aspx?SQL+connection+best+practices

    【讨论】:

      猜你喜欢
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 2012-09-12
      • 2019-12-16
      相关资源
      最近更新 更多