1

次のコードを検討してください。

private static void GetData<TConnection, TCommand>( string connectionString, DataTable dataFromDbf, string commandText )
  where TConnection : IDbConnection
  where TCommand : IDbCommand {
  using( IDbConnection oConn = GetConnection<TConnection>( connectionString ) ) {

    oConn.Open( );
    IDbCommand oCmd = oConn.CreateCommand( );
    oCmd.CommandText = commandText;
    dataFromDbf.Load( oCmd.ExecuteReader( ) );
    oConn.Close( );
  }
}

すべての顧客がAdavatageDBサーバーを持っているわけではなく、OleDbConnectionにフォールバックする必要があるため、この方法は一般的です。ただし、ほとんどの場合、AdsConnectionオブジェクト(Advantage.Data.Provider.dllから)を使用します。

上記のコードは接続を閉じ、usingステートメントを終了するとオブジェクトが破棄されます。

Advantage Management Utilityを使用してAdsサーバー上のすべての接続を表示すると、接続が開いたままになっていることがわかります。すべてではありません!メソッドをおそらく200回呼び出しますが、開いたままになるのはごくわずかで、クライアントのMAX_CONNECTIONSを超えることもあります。JensMühlenhoffのおかげで、それを回避することができます。

質問は:

oConn.Close()を呼び出すときに接続が閉じないのはなぜですか?誰かアイデアはありますか?

4

1 に答える 1

3

接続プールを使用していますか?

ADSオンラインヘルプによると、Close()実際には接続を閉じないが、接続プールに戻す可能性があります。

その場合、プーリングを無効にするか、を呼び出しますFlushConnectionPool()。これにより、アプリケーション全体の接続プールがフラッシュされることに注意してください。

http://devzone.advantagedatabase.com/dz/webhelp/Advantage10.1/dotnet_adsconnection_close.htm

http://devzone.advantagedatabase.com/dz/webhelp/Advantage10.1/dotnet_adsconnection_flushconnectionpool_.htm

于 2012-05-16T10:27:34.137 に答える