1

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、リンク、またはトリックを知っていますか?

4

3 に答える 3

1

SQL クエリを修正してください。 なぜ 100k 行から最初の 50 かそこらだけを使用するのですか?? 使用TOP 100またはそのようなもの! アプリケーションが 10 万行をフィルタリングする必要がある理由はありません。これはデータベースの仕事です。

于 2011-09-01T14:37:43.150 に答える
0

クライアントの問題よりもはるかに重要なのは、サーバー側で何が起こるかです。クエリを発行してから結果の読み取りを停止すると、ネットワーク バッファーがいっぱいになり、結果を書き込む余地がないため、サーバーは実行の途中でクエリを一時停止する必要があります。実行中に中断されたクエリは、メモリ、ロック、そして最も重要なワーカー スレッドなど、多くのリソースを消費します (これらのリソースはほとんどありません)。

必要なデータのみに対してクエリを発行し、すべてのデータを消費し、接続を解放し、さらに重要なことにサーバー リソースを解放します。クエリが複雑すぎる場合は、設計図に戻ってデータ モデルを再設計し、要求したクエリに適切かつ効率的に応答できるようにします。今、あなたは完全に間違った木を吠えています。単に悪い状況を悪化させる方法を尋ねているだけです。

于 2011-09-01T19:10:01.017 に答える
-1

SQL Server ドライバー (Native Client 10 - sqlncli10.dll) を使用して ODBC データ ソースを作成しました。この ODBC データ ソースは、MARS を有効にするように構成されました (キー、 の値は でなければなりません)。次に、Sun の JDBC-ODBC ブリッジを使用しました。一時停止がなくなり、驚くべきことに、JTDS および MSSQL の純粋な Java JDBC ドライバーよりもフェッチ時間が速くなりました。HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ datasourceMARS_ConnectionYes

http://msdn.microsoft.com/en-us/library/ms345109(SQL.90).aspxによると、MARS はサーバー支援機能です。純粋な Java ドライバー (JTDS および MSSQL から) は、サーブド ベースの MARS をサポートしていないようです (少なくとも、多くの構成変更の後でそれを有効にすることはできませんでした)。MSSQL Server を使用するユーザー ベースのほとんどが Windows で実行されているため (驚くことではありません)、JTDS から JDBC-ODBC に切り替えようとしています。Native Client ODBC ドライバーと JDBC-ODBC ブリッジはどちらも成熟しており、フル機能を備えた最新のソリューションであるように見えるので、問題はないはずです。どなたかご存知の方コメントお願いします!

Linux ベースのユーザーは引き続き JTDS を使用します。MARS がサーバー支援機能であることがわかったので、JTDS と Microsoft に対して、純粋な Java JDBC ドライバーで MARS をサポートする機能要求を満たします。

于 2011-09-16T12:03:18.597 に答える