jTDS と Microsoft の JDBC ドライバーをテストしていますが、クエリの実行で不要な一時停止が発生しています。このアプリケーションは多くの ResultSet を開き、それぞれから数行だけをフェッチします。各クエリは約 10 万行を選択しますが、フェッチするのは約 50 行のみです (ページを埋めるのに十分です)。問題は、最初のクエリ以降のすべてのクエリに約 2 秒の一時停止が含まれていることです。その間、ドライバは前の ResultSet からすべての行を一時ストレージ (メモリまたはディスク) にロードするため、後でトラバースできます。最悪のシナリオでは約 6 つのクエリがあるため、約 10 秒の一時停止が発生し、アプリケーションがユーザーに応答しなくなります。MSSQL のバージョンは 2005 です。
このような一時停止を取り除くために、Microsoft JDBC ドライバーの接続文字列パラメーターを介して MARS (複数のアクティブな結果セット) を有効にしようとしました (ドキュメントが不足しているため、https://sites.google.com/にリストされているすべてのものを試しました)。サイト/sqlconnect/sql2005strings )。接続文字列の例:
jdbc:sqlserver://TESTDBMACHINE;instanceName=S2005;databaseName=SampleDB;MarsConn=yes
しかし、どれも問題を解決しません。Microsoft JDBC ドライバーは、接続文字列で何でも受け入れるようです。MarsConn=yes を PleaseBeFast=yes に置き換えると、MS ドライバーはパラメーターを無視し、事実をログに記録しません。MARS が、以前にアクティブだった結果セットから行をキャッシュするだけのクライアントのみの機能なのか、それともサーバー機能なのかはわかりません。特定の接続が MARS を使用しているかどうかをサーバー側から検出する方法さえ知りません。これについてコメントいただければ、それは大歓迎です。
一時停止の別の解決策は、スクロール可能な (双方向) 結果セットを使用することでした。これにより一時停止は解消されますが、フェッチ時間が 80% 遅くなり、ネットワークの消費量が増えます。現在、実際の接続のプールを保持し、個別の「ResultSet フリー」接続に対してクエリを自動的に発行する JDBC 接続ラッパーの実装を検討しています。ただし、各接続とそのアクティブな ResultSet の間のリンクを保持する必要があるため、これはやや面倒です。また、サーバーからより多くの接続を消費し、DBA に問題を引き起こす可能性があります。また、すべてのクエリを同じ接続で発行する必要があるアクティブなトランザクションがある場合、このソリューションは役に立ちません。
2 回目以降のクエリ実行から一時停止を取り除くことができるパラメーター、構成、特定の API、リンク、またはトリックを知っていますか?