【发布时间】:2016-07-22 05:41:26
【问题描述】:
我已将我的项目从 MSSQL 迁移到 MySQL,我必须实现的功能之一是可以在 db 端存储会话,因此必须配置自定义会话存储提供程序。我使用 Visual Studio 的 MySQL 连接器来正确设置会话提供程序。这是我的 web.config 中的一个 sn-p:
<connectionStrings>
<remove name="LocalMySqlServer" />
<add name="LocalMySqlServer" connectionString="server=<SERVER>;user=<USER>;pwd=<PASSWORD>;port=<PORT>;database=<DBNAME>;AutoEnlist=false;" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
<system.web>
<sessionState mode="Custom" cookieless="false" timeout="20" allowCustomSqlDatabase="true" regenerateExpiredSessionId="true" customProvider="MySqlSessionStateProvider">
<providers>
<clear/>
<add name="MySqlSessionStateProvider" type="MySql.Web.SessionState.MySqlSessionStateStore, MySql.Web, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" applicationName="/" description="My Local Session State" connectionStringName="LocalMySqlServer" writeExceptionsToEventLog="True" autogenerateschema="True" enableExpireCallback="False" />
</providers>
</sessionState>
...
</system.web>
一旦我运行我的应用程序,数据库架构就被修改并创建了所有必需的表:
此外,我检测到在执行期间会话表正在填充会话信息,因此这是一个很好的信号,表明连接有效并且 MySQL 自定义提供程序正在执行应该执行的操作。
不幸的是,一段时间后,我的应用程序由于 System.OutOfMemoryException 而失败。堆栈跟踪如下所示:
我的假设是会话项反序列化存在一些问题。我有一些存储在会话中的类,它们都由适当的[Serializable] 属性标记。其他项目具有原始类型(bool,int ..)所以,我的问题是还有什么可能导致这个问题?问题是我什至无法检测到此问题发生的确切位置。任何建议表示赞赏。
【问题讨论】:
-
如果不访问代码,此类问题很难调试。使用 sql server 完全相同的代码可以正常工作吗?您在会话中存储的类是什么?您是否看到数据库中会话的大小随着时间的推移而增长?
-
您的问题是,可能由于某处代码中的某些错误,您在
SessionStateItemsCollection中存储了越来越多的项目,直到最终无法为底层数组需要保存所有项目,你会得到这个异常。有关数组大小限制,请参阅 stackoverflow.com/questions/5367320 或 stackoverflow.com/questions/23206496 或 blogs.msdn.microsoft.com/ericlippert/2009/06/08/…。 -
您可以直接查询您的 MySQL 数据库以查看您的会话存储有多大,以及是什么占用了所有空间?
标签: c# mysql asp.net serialization session-state