バグ検証 id=13043

connection propertyに"gatherPerfMetrics=true"を指定するとコネクションプールの初期化時にNullPointerExceptionが発生すると報告された件
http://bugs.mysql.com/bug.php?id=13043

これは正確には以下の経緯で引き起こされている.

  • DBCP等、アプリケーションサーバ上で呼び出されたモジュールがクエリ"SELECT 1"を接続成否確認のために実行.
  • "SELECT 1"のようなクエリは対象テーブルが存在しないため,サーバからテーブル名無しの状態で結果セットが返ってくる.
  • MySQLサーバ側がver4.1以前なのか以降なのかで結果セットのプロトコルは異なっている
  • "gatherPerfMetrics=true"が指定された場合にのみ実行されるConnector/J ver3.1.10の実装コードがあるが,その部分が新しいプロトコルにしか対応していなかった.
  • 従ってMySQL4.0.xなどを使っているユーザの場合,"gatherPerfMetrics=true"を指定して"SELECT 1"を実行するとNullPointerExceptionすることとなった.

TomcatやDBCP,およびコネクションプーリング全般はこのバグとは直接関係はありません.

関連要素はMySQLサーバのバージョンと一部の種類のクエリ.例えば"SELECT version()"とかでも同じ現象を見ることができる.

参考:
MySQL 4.1以前 http://www.redferni.uklinux.net/mysql/MySQL-323.html
MySQL 4.1以降 http://www.redferni.uklinux.net/mysql/MySQL-Protocol.html
Connector/J ver3.1.10 Fieldクラスのコンストラク
Connector/J ver3.1.10 ResultSetクラスの350行目以降