Я перенесла свой проект из MSSQL в MySQL, и одна из возможностей, которую я должен реализовать, - это возможность хранения сеансов на стороне db, поэтому настраиваемый пользовательский магазин хранилища сеансов должен быть настроен. Я использовал соединитель MySQL для визуальной студии, чтобы правильно настроить поставщика сеанса. Вот отрывок из моего web.config:Пользовательский поставщик хранилища сеансов MySQL - проблема десериализации
<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-сервером точно такой же код работал нормально? Какие классы вы храните в своей сессии? Вы видите, что с течением времени в вашей базе данных растут размеры? – Evk
Ваша проблема в том, что, вероятно, из-за какой-то ошибки в коде где-то вы сохраняете все больше элементов в 'SessionStateItemsCollection', пока в конечном итоге становится невозможно выделить достаточно большой непрерывный буфер памяти для базового массива, необходимого для хранения всех элементы, и вы получите это исключение. Ограничения размера массива см. По адресу http://stackoverflow.com/questions/5367320 или http://stackoverflow.com/questions/23206496 или, возможно, https://blogs.msdn.microsoft.com/ericlippert/2009/06/08/вне памяти-это-не-см-к-физической памяти /. – dbc
Можете ли вы напрямую запросить свою базу данных MySQL, чтобы узнать, насколько велики ваши хранилища сеансов, и что занимает все пространство? – dbc