2016-04-02 2 views
1

Я перенесла свой проект из 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> 

После того, как я запускаю мое приложение дб схема была изменена, и были созданы все необходимые таблицы:

enter image description here

Кроме того, я обнаружил, что во время выполнения сессии таблица заполняется информацией о сеансе, поэтому я хороший сигнал о том, что соединение работает, и пользовательский поставщик MySQL делает то, что должен делать.

enter image description here

К сожалению, через некоторое время мое приложение не из-за System.OutOfMemoryException. Трассировка стека выглядит следующим образом:

enter image description here

Мое предположение, что существует какая-то проблема с сессии пунктов десериализации. У меня есть несколько классов, которые хранятся в сеансе, и все они помечены соответствующим атрибутом [Serializable]. Другие элементы имеют примитивные типы (bool, int ..) Итак, мой вопрос заключается в том, что еще может вызвать эту проблему? Проблема в том, что я даже не могу определить точное место, откуда начинается эта проблема. Любое предложение оценивается.

+0

Такие проблемы трудно отлаживать без доступа к коду. С sql-сервером точно такой же код работал нормально? Какие классы вы храните в своей сессии? Вы видите, что с течением времени в вашей базе данных растут размеры? – Evk

+0

Ваша проблема в том, что, вероятно, из-за какой-то ошибки в коде где-то вы сохраняете все больше элементов в 'SessionStateItemsCollection', пока в конечном итоге становится невозможно выделить достаточно большой непрерывный буфер памяти для базового массива, необходимого для хранения всех элементы, и вы получите это исключение. Ограничения размера массива см. По адресу http://stackoverflow.com/questions/5367320 или http://stackoverflow.com/questions/23206496 или, возможно, https://blogs.msdn.microsoft.com/ericlippert/2009/06/08/вне памяти-это-не-см-к-физической памяти /. – dbc

+0

Можете ли вы напрямую запросить свою базу данных MySQL, чтобы узнать, насколько велики ваши хранилища сеансов, и что занимает все пространство? – dbc

ответ

0

Не могли бы вы перепроверить, что все элементы внутри ваших классов являются общедоступными [частные члены не будут заботиться во время сериализации].

Смежные вопросы