MySQLの接続部品の中でもConntctor/JやConnector/ODBCに比べて極めて地味な存在です。
概要
Connector/MXJは、正確にはJDBCドライバのようなアプリケーションから接続する際に利用するソフトウェア部品ではなく、MySQLサーバをJavaのコンポーネントとするためのユーティリティです。Javaアプリケーション内でMySQLサーバを起動停止などができます。
Connector/MXJを利用する利点としては、Apache TomcatやJBossなどJMXに対応したJavaアプリケーションサーバと組み合わせて利用すると、他のMBeanと同様にMySQLサーバを管理できます。MySQLサーバをレプリケーション構成で利用し、スレーブをアプリケーションサーバと同じノード上で稼働させる場合、アプリケーションサーバからMySQLサーバを起動するなど一括で管理できます。
Connector/MXJのパッケージには以下の3点が含まれます。
- MBeanの実装: mysql-connector-mxj-[ver].jar *1
- MySQLサーババイナリ: connector-mxj-[ver]-db-files.jar *1
- サンプルコードやユーティリティなど
*1 上記の[ver]にはライセンスとバージョン番号が入ります。
Connector/MXJ 5.0.11のコミュニティ版の場合、mysql-connector-mxj-gpl-5-0-11.jarとなります。
以下ではmysql-connector-mxj.jarと表示します。
バージョン
2010年2月10日現在の最新版は5.0.11、同梱されるMySQLサーバのバージョンは5.1.40です。Connector/MXJには複数のプラットフォーム用のMySQLサーバのバイナリが含まれています。対応しているプラットフォームは下記のページの後半を参照。
http://dev.mysql.com/doc/refman/5.1/en/connector-mxj-install-platforms.html
標準で対応していないプラットフォームでの利用や最新版のMySQLサーバの組み込みは、Connector/MXJのresourcesディレクトリで以下の作業を行いconnector-mxj-db-files.jarを再作成します。
- mysqldを追加または変更
- バージョン番号を記載したversion.txtを追加または変更
- platform-map.propertiesに該当するプラットフォームと対応するバイナリを格納したディレクトリ名を記載
- (バージョンが変わる場合は) connector-mxj.properties内のバージョンを変更
マニュアル
残念ながらマニュアルがバージョンアップに追いついていません。
サンプルのクラスパスなどでmysql-connector-mxj.jarのみ記載されている場合でも、mysql-connector-mxj.jarとmysql-connector-mxj-db-files.jarの両方を指定して下さい。
Connector/MXJ 5.0.4以降では、mysql-connector-mxj.jarとmysql-connector-mxj-db-files.jarに分かれているので、更新されてないマニュアルの説明に従うとアプリケーションなどの起動時にExceptionが出ます。
こっちの説明は正しい。
http://dev.mysql.com/doc/refman/5.1/en/connector-mxj-install-jboss.html
こっちのは説明が古すぎ。
http://dev.mysql.com/doc/refman/5.1/en/connector-mxj-usagenotes-standard-environment.html
Connector/MXJの使用例
単純な利用方法はJavaアプリからJDBCドライバ経由でMySQLサーバに接続する際の、接続URLにjdbc:mysql:mxj:///....と書いておく。あとはJDBCドライバを利用した通常のコーディングと同様にjava.sql.ConnectionなどでMySQLサーバに接続を試みます。
このとき対象のMySQLサーバが起動していなければ、Connector/MXJから自動的に起動してくれます。下記が一番シンプルな例。※Exceptionの処理は割愛
import java.sql.Connection; import java.sql.DriverManager; public class MxjTest { public static void main(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql:mxj:///test", null); } }
mysql-connector-mxj.jar、mysql-connector-mxj-db-files.jarとConnector/Jのjarにクラスパスを設定した上で、上記のアプリを実行すると、標準コンソールにこんな出力がされます。
[/private/var/folders/0A/0AMsejI9GLmgObZTIsXnA++++TI/-Tmp-/mysql-c.mxj/bin/mysqld][--no-defaults][--pid-file=/private/var/folders/0A/0AMsejI9GLmgObZTIsXnA++++TI/-Tmp-/mysql-c.mxj/data/MysqldResource.pid][--socket=mysql.sock][--datadir=/private/var/folders/0A/0AMsejI9GLmgObZTIsXnA++++TI/-Tmp-/mysql-c.mxj/data][--basedir=/private/var/folders/0A/0AMsejI9GLmgObZTIsXnA++++TI/-Tmp-/mysql-c.mxj][--port=3306] [MysqldResource] launching mysqld (driver_launched_mysqld_1) 100210 10:44:59 [Warning] Setting lower_case_table_names=2 because file system for /private/var/folders/0A/0AMsejI9GLmgObZTIsXnA++++TI/-Tmp-/mysql-c.mxj/data/ is case insensitive 100210 10:44:59 [Note] Plugin 'FEDERATED' is disabled. 100210 10:44:59 InnoDB: Started; log sequence number 0 44233 100210 10:44:59 [Note] Event Scheduler: Loaded 0 events 100210 10:44:59 [Note] /private/var/folders/0A/0AMsejI9GLmgObZTIsXnA++++TI/-Tmp-/mysql-c.mxj/bin/mysqld: ready for connections. Version: '5.1.40' socket: 'mysql.sock' port: 3306 MySQL Community Server (GPL) [MysqldResource] mysqld running as process: 15628
MySQLサーバがデフォルトの3306番ポートで起動しているのが分かります。InnoDBが利用可能、FEDERATEDが無効になっていることも表示されています。psコマンドなどでもmysqldが動いているのが確認できます。
MySQLサーバの実行ファイルmysqldは、この例では/private/var/folders/0A/0AMsejI9GLmgObZTIsXnA++++TI/-Tmp-/mysql-c.mxj/bin/というディレクトリに置かれています。これはユーザが明示的に指定していない場合、java.io.tempdirのサブディレクトリをMySQLサーバのbasedirとして、jarの内容を展開するためです。sockファイルやデータディレクトリも同様にこのbasedirの下に自動的に作成されます。
Connector/MXJから起動されたMySQLサーバにはmysqlクライアントからも接続できます。但し、Unix系のmysqlクライアントはデフォルトではsocket接続使用するため、上記のbasedir配下の.sockファイルを明示的に指定するか、--protocolオプションでtcpを指定しないとつながらないでしょう。
ちなみに、最初のサンプル、大きな問題があります。MySQLサーバは起動しましたが、起動しっぱなし。再度同じアプリを実行しても既にMySQLサーバが起動しているので何も出力されません。停止するにはmysqladminコマンドで止めることになっちゃいます。そこでMysqldResourceのshutdown() メソッドを使用して停止してみます。
import java.sql.Connection; import java.sql.DriverManager; import com.mysql.management.MysqldResource; public class MxjTest { public static void main(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql:mxj:///test", null); MysqldResource mysqld = new MysqldResource(); mysqld.shutdown(); } }
すると、今回は最後に下記のような出力がされ、MySQLサーバが停止したことを確認できます。
[MysqldResource] stopping mysqld (process: 16367) 100210 16:37:57 [Note] /private/var/folders/0A/0AMsejI9GLmgObZTIsXnA++++TI/-Tmp-/mysql-c.mxj/bin/mysqld: Normal shutdown 100210 16:37:57 [Note] Event Scheduler: Purging the queue. 0 events 100210 16:37:59 InnoDB: Starting shutdown... 100210 16:38:00 InnoDB: Shutdown completed; log sequence number 0 44233 100210 16:38:00 [Note] /private/var/folders/0A/0AMsejI9GLmgObZTIsXnA++++TI/-Tmp-/mysql-c.mxj/bin/mysqld: Shutdown complete kill: 16367: No such process [MysqldResource] shutdown complete
実際にはMysqldFactory.javaやMysqldResourceI.javaでMysqldResourceオブジェクトを生成して利用することもあるでしょう。