13

クエリ ログに目を通すと、説明のつかない奇妙なパターンが見つかりました。

実質的にすべてのクエリの後、「DUALから1を選択」しました。

これがどこから来ているのかわかりません。また、クエリを明示的に作成していません。

ログは基本的に次のようになります。

    10 Query       SELECT some normal query
    10 Query       select 1 from DUAL
    10 Query       SELECT some normal query
    10 Query       select 1 from DUAL
    10 Query       SELECT some normal query
    10 Query       select 1 from DUAL
    10 Query       SELECT some normal query
    10 Query       select 1 from DUAL
    10 Query       SELECT some normal query
    10 Query       select 1 from DUAL
    ...etc...

以前にこの問題に遭遇した人はいますか?

MySQL バージョン: 5.0.51

ドライバー: JDBC を使用する Java 6 アプリ。mysql-connector-java-5.1.6-bin.jar

接続プール: commons-dbcp 1.2.2

validationQuery は「DUAL から 1 を選択」(明らかに) に設定されており、検証クエリが null 以外の場合、接続プールのデフォルトで testOnBorrow と testOnReturn が true に設定されているようです。

これが私にもたらすもう1つの質問は、実際に検証クエリが必要かどうか、または検証クエリを無効にするか、少なくとも使用頻度を減らすことでパフォーマンスを向上できるかどうかです。残念ながら、私たちの「データベースマネージャー」を書いた開発者はもう私たちと一緒にいないので、彼にそれを正当化するように頼むことはできません. 任意の入力をいただければ幸いです。しばらくの間、API と Google を掘り下げて、価値のあるものが見つかったら報告します。

編集:さらに情報を追加

EDIT2:後でこれを見つけた人のために、正解で求められた情報を追加しました

4

3 に答える 3

24

アプリケーションが使用している接続プールから来ている可能性があります。簡単なクエリを使用して接続をテストします。

mysql-connector-j のソースをざっと見たところ、そこから来ていません。

最も可能性の高い原因は、接続プールです。

一般的な接続プール:

commons-dbcpには構成プロパティがありvalidationQuery、これと組み合わせてtestOnBorrow、表示さtestOnReturnれるステートメントを引き起こす可能性があります。

c3p0にはpreferredTestQuery、、、およびtestConnectionOnCheckintestConnectionOnCheckoutidleConnectionTestPeriod

価値があるのは、接続テストとチェックアウト/借用を構成する傾向があるためです。

于 2009-05-27T20:47:58.503 に答える
5

100 回の挿入/削除を実行し、DBCP と C3PO の両方でテストしました。

DBCP :: testOnBorrow=true は、応答時間に 4 倍以上の影響を与えます。

C3P0 :: testConnectionOnCheckout=true は、応答時間に 3 倍以上の影響を与えます。

結果は次のとおりです。 DBCP – BasicDataSource

100 トランザクション (挿入操作) の平均時間 testOnBorrow=false :: 219.01 ms testOnBorrow=true :: 1071.56 ms

100 トランザクション (削除操作) の平均時間 testOnBorrow=false :: 223.4 ms testOnBorrow=true :: 1067.51 ms

C3PO – ComboPooledDataSource 100 トランザクション (挿入操作) の平均時間 testConnectionOnCheckout=false :: 220.08 ms testConnectionOnCheckout=true :: 661.44 ms

100 トランザクション (削除操作) の平均時間 testConnectionOnCheckout=false :: 216.52 ms testConnectionOnCheckout=true :: 648.29 ms

結論 : DBCP で testOnBorrow=true を設定するか、C3PO で testConnectionOnCheckout=true を設定すると、パフォーマンスが 3 ~ 4 倍影響を受けます。パフォーマンスを向上させる他の設定はありますか。

-ドゥルガ・プラサード

于 2010-02-18T11:20:45.260 に答える
2

「デュアル」テーブル/オブジェクト名は、MySQL が互換性のためにサポートする Oracle 構造です。または、ターゲットを持たないクエリのターゲットを提供しますが、人々はすべて暖かくあいまいに感じたいと思っています。例えば

select curdate()

することができます

select curdate() from dual

Oracle を実行しているかどうかを確認するために誰かがあなたを盗聴している可能性があります。

于 2009-05-27T20:48:59.877 に答える