日本語情報がほとんど無いConnector/MXJ

MySQLの接続部品の中でもConntctor/JやConnector/ODBCに比べて極めて地味な存在です。

概要

Connector/MXJは、正確にはJDBCドライバのようなアプリケーションから接続する際に利用するソフトウェア部品ではなく、MySQLサーバをJavaコンポーネントとするためのユーティリティです。Javaアプリケーション内でMySQLサーバを起動停止などができます。

Connector/MXJを利用する利点としては、Apache TomcatJBossなど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オブジェクトを生成して利用することもあるでしょう。