6

すべてのアプリケーションのMSSQLからのドライバーとしてnet.sourceforge.jtds.jdbc.Driverを使用しています。プリペアドステートメントのパフォーマンスに問題があり、sendStringParametersAsUnicode=falseで問題が解決することを学びました。残念ながら、ドライバーに値を受け入れさせることができないようです。Microsoftドライバーcom.microsoft.sqlserver.jdbc.SQLServerDriverにパラメーターを正常に受け入れさせることができます。

jdbc:sqlserver://servername:1433;databaseName=dbname;sendStringParametersAsUnicode=false

persistence.xmlと私のds.xmlで動作します。準備されたステートメントは、22秒で100になります。

ただし、JTDSから同じパフォーマンスの向上を得ることができないようです。それはまだ準備されたステートメントの周りにぶら下がっていて、各反復で数秒かかります。

文字列にいくつかのバリエーションを試しましたが、テスト(Hibernate.connection.urlを使用したpersistence.xml)とJTAおよびds.xmlを使用したサーバーで同じラグが見られました。

jdbc:jtds:sqlserver://server:1433/dbname;sendStringParametersAsUnicode=false

jdbc:jtds:sqlserver://server:1433;sendStringParametersAsUnicode=false;databaseName=dbname

jdbc:jtds:sqlserver://server:1433;sendStringParametersAsUnicode=false;selectMethod=cursor;socketKeepAlive=true;databaseName=dbname

私が読んだすべてのことは、Microsoftドライバーが遅いと述べており、私の会社は過去に問題を抱えていました。できればJTDSを使いたいのですが、プリペアドステートメントが10秒待ちきれません!

誰かアイデアがありましたか?

ありがとう

4

1 に答える 1

2

状態のドキュメント:sendStringParametersAsUnicode

文字列パラメーターを SQL Server データベースに Unicode で送信するか、データベースの既定の文字エンコーディングで送信するかを決定します。これは、SQL Server 2000 のパフォーマンスに深刻な影響を与えます (7.0 のように) 型を自動的にキャストしないためです。インデックス シークの代わりにインデックス スキャン。Sybase の場合、サーバーの文字セットでエンコードできない文字列を Unicode 文字列として送信するかどうかを決定します。エンコーディング ロジックのパフォーマンスが低下するため、unitext または univarchar データ型が使用されていない場合、または charset が utf-8 である場合は、このオプションを false に設定します。

したがって、クエリにそれを含めるとパフォーマンスが低下する場合は、それがクエリに適していないことを示唆しており、ドキュメントで警告されている問題を正確に見ています。

MS ドライバーでパフォーマンスの向上見られる場合sendStringParametersAsUnicode、JTDS では MS ドライバーとは微妙に異なる意味を持つ可能性があります。

オプションを付けた場合と付けない場合の各ドライバーのパフォーマンスはどうですか? 使用している SQL Server のバージョンは何ですか? クエリ プロファイラーは、これらのクエリに対して何を表示しますか? あなたのクエリは何ですか?また、関連するフィールドのタイプは何ですか?

于 2012-01-31T07:16:05.367 に答える