2017-03-24 7 views
-2

OleDbConnectionオブジェクトをmode = "StateServer"またはmode = "sqlserver"のセッションに格納しますが、これを試している間にセッション状態をシリアル化できないというエラーが表示されます。 stateserverおよびsqlserverモードでは、asp.netはセッション状態オブジェクトをシリアル化し、その結果、直列化不能オブジェクトまたはMarshalByRefは許可されません。oledbconnectionオブジェクトをシリアライズする方法C#

+1

悪い考えで、それをしません。データベース接続は可能な限り短命でなければなりません。それらを使用して処分し、必要以上に長く保管しないでください。唯一実行可能なオプションは、ユーザーに固有の接続文字列を格納することです。 – Igor

+0

は完全に@Igor – Alistair

+0

@Igorに同意しているとは限らない場合もありますが、いくつかのユースケースについては、_暖かい、ready-to-go_接続のために何か言われています。私はそれがセッションに入ることを保証していません。 – MickyD

答えて

1

データベース接続をシリアル化する必要はありません。そのようなリソースは、本質的に直列化可能ではないため、セッションに保存することはできません。

InProcセッションモードを使用してデータベース接続を保存すると、オブジェクトへの参照が格納され、他のすべてのセッションモードではシリアル化が使用されるため、特定の形式のファイルまたはデータベースにパブリックプロパティを書き込みます。これはネットワーク接続を保持しません。

セッションでデータベース接続を保存しないだけで問題ありません。 「接続プーリング」と呼ばれる既存のホイールを再作成しないでください。これを自分で行う必要はありません。

0

これは仕様による動作です。適切な理由によりDbConnectionの実装にSerializableとマークされていません。最も重要なのは、開いている接続がアンマネージドライブソケットまたはパイプハンドルを保持することです。

アプリケーション設計の観点から、ライブ接続をセッションに格納することは意味をなさないでしょう。また、要求を超えて接続を開いたままにすると、パフォーマンスが低下する可能性があります。データベース接続はプールされ、新しい接続を作成して開くと、既存の接続をプールから内部的に再利用するため、要求ごとに1つの接続を開く/閉じるのが最も効率的で推奨されます。

何らかの理由でセッションに依存する接続がある場合は、実際の接続オブジェクトの代わりに接続文字列(またはそれらのセットを指すインデックス)を格納します。また

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

関連する問題