2016-04-02 11 views
1

MSSQLからMySQLにプロジェクトを移行しました。実装する必要がある機能の1つは、db側でセッションを保存する可能性があるため、カスタムセッションストアプロバイダを設定する必要があります。私は、セッションプロバイダを適切にセットアップするために、Visual Studio用の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> 

私は自分のアプリケーションのDBスキーマが変更され、必要なすべての表が作成された実行すると:

さらに

enter image description here

、私は、実行セッション中にこれを検出しテーブルはセッション情報で満たされているので、接続が機能し、MySQLカスタムプロバイダが行うべきことを行う良いシグナルです。

enter image description here

残念ながら、いくつかの時間後に私のアプリケーションは、System.OutOfMemoryExceptionにのために失敗しました。スタックトレースは次のようになります。

enter image description here

私の仮定は、セッションアイテムデシリアライゼーションといくつかの問題があるということです。セッションに格納されるいくつかのクラスがあり、それらのすべてに適切な[Serializable]属性が付けられています。他の項目はプリミティブ型(bool、int ..)を持っています。問題は、この問題が発生している場所から正確な場所を検出することさえできないことです。どんな提案も感謝しています。

+0

このような問題は、コードにアクセスすることなくデバッグするのが難しいです。 SQL Serverでは、まったく同じコードが正常に機能しましたか?セッションに保存するクラスは何ですか?あなたのセッションは、あなたのデータベースで時間の経過とともにサイズが大きくなってきていますか? – 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

クラス内のすべてのアイテムが公開されていることを再確認できますか?[シリアル化中にプライベートメンバーは世話をしません]。