JDBCを使ってMySQLにアクセスするためのJava側のドライバとして、MySQL Connector/Jというものがある。
今回、JDK 1.3、Tomcat 4.1が動いている環境にMySQL Connector/J 5.0をインストールし、動かしてみて気付いたことや、遭遇したトラブルと実際に行った対処を書き留める。
(1) JDK 1.3でMySQL Connector/Jを使う時の注意点
MySQL Connector/Jのマニュアルの§1.1.1にあるが、JDK 1.4未満では、class verifierをOFFにする必要がある。コマンドラインからJava VMを起動する場合は、-Xverify:noneを指定すれば良い。
(2) JDK 1.3+TomcatでMySQL Connector/Jを使う時の注意点
上記(1)の制限により、TomcatのJava VM起動時オプションに"-Xverify:none"を指定する必要がある。FreeBSD 4.11でTomcat 4.1を動かしているこのサーバーでは、/etc/rc.confに
tomcat41_java_opts="-Xverify:none"を加えている。
なお、シェルのコマンドラインからjavaコマンドを使用する場合は、mysql-connector-java.jarをJDKのディレクトリの下のjre/lib/ext/に置いておくとCLASSPATHの指定が不要になるが、Tomcatの場合はこれは無効である。インストールマニュアルの通り、mysql-connector-java.jarをTomcatのディレクトリの下のcommon/lib/に置く必要がある。
(3) MySQL Connector/JのExample 10がSQLエラーになる
あるMySQLのサーバーに対して、MySQL Connector/JのマニュアルのExample 10のコードを動かすと、
You have an error in your SQL syntax near 'DEFAULT, 'AUTO INCREMENT here?')' at line 1というメッセージと共にSQLExceptionが発生した。
そのサーバーに対してMySQLのコマンドライン(クライアント)からサンプルコードと同等の処理である
INSERT INTO ... VALUES (DEFAULT, "...");を実行すると、同様のエラーとなった。
MySQLのinfoによると、MySQLをconfigureする時にDONT_USE_DEFAULT_FIELDSを指定すると、そういう動作になるらしい。このコンパイルオプションはバージョン5.0.2で削除されているが、システム変数sql_modeをSTRICT_TRANS_TABLESにすると同じことが起こる。
このエラーを回避するには、rs.insertRow();の前に
rs.updateInt("priKey", 0);を足すと良い。
第2引数は、0以外だと、auto incrementの初期値を与えることになるので正しくない。
コメント