JBoss AS7のDatasourceとしてMySQLを追加するお話の続き。
以前は管理コンソール(localhost:9990)からJDBCドライバの組み込みとDatasourceの設定を行いました。一方、管理コンソールを使わず、モジュールを組み込む方法で行うことも出来ます。メリットはJBossを起動せずに設定が済むくらいですが、お仕事の都合上、こちらの方法も紹介します。
対象環境は管理コンソールの時と同じです。
また、Datasourceの設定は次のようにします。
上記の設定値に従い、$JBOSS_HOME\standalone\configuration\standalone.xmlの<subsystem xmlns="urn:jboss:domain:datasources:1.0">配下の<datasources>セクションに以下の内容を追加します。
なお、5.1.29以前を使用する場合は次のように<driver-class>タグは不要です。
以上、モジュール組込み方式によるDatasourceの追加方法でした。
今回参考にさせて頂いたサイトは以下の通りです。
上2つのサイトを中心に見ていましたがどうしてもうまくいかなくて、管理コンソールからやってみたりと寄り道しましたが、「JBoss DuplicateServiceException」で検索をして見つかったStack Overflowの記事でやっと解決しました。
以前は管理コンソール(localhost:9990)からJDBCドライバの組み込みとDatasourceの設定を行いました。一方、管理コンソールを使わず、モジュールを組み込む方法で行うことも出来ます。メリットはJBossを起動せずに設定が済むくらいですが、お仕事の都合上、こちらの方法も紹介します。
対象環境は管理コンソールの時と同じです。
- JBoss Application Server 7.1.1.Final
- Java SE Runtime Environment(JRE) 7u80
- MySQL Community Server 5.6.27
- MySQL Connector/J 5.1.39
JDBCドライバを追加する
特定のディレクトリへのJDBCドライバの設置とドライバの定義を追加します。
- 次の2つのディレクトリを作成する
- $JBOSS_HOME\modules\com\mysql
- $JBOSS_HOME\modules\com\mysql\main
- $JBOSS_HOME\modules\com\mysql\mainに「mysql-connector-java-5.1.39-bin.jar」を設置する
- 同ディレクトリに「module.xml」というXMLファイルを作成する。ファイルの中身は次の通り。
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.mysql">
<resources>
<resource-root path="mysql-connector-java-5.1.39-bin.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
<module name="javax.servlet.api" optional="true"/>
</dependencies>
</module> - $JBOSS_HOME\standalone\configuration\standalone.xmlの<subsystem xmlns="urn:jboss:domain:datasources:1.0">配下の<drivers>セクションに以下の内容を追加する
<subsystem xmlns="urn:jboss:domain:datasources:1.0">
<datasources>
・・・
<drivers>
・・・
<driver name="mysql" module="com.mysql">
<driver-class>com.mysql.jdbc.Driver</driver-class>
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>
</subsystem>
Datasourceの追加
続いてDatasourceの追加。接続先のMySQLの設定値は以下の物とします。
ホスト名 | localost |
ポート | 3306 |
ユーザー | root |
パスワード | (なし) |
データベース | sampledb |
また、Datasourceの設定は次のようにします。
name | mysqlDatasource |
JNDI Name | java:jboss/datasources/mysqlDatasource |
Connection URL | jdbc:mysql://localhost:3306/sampledb |
User Name | root |
Password | (空欄) |
上記の設定値に従い、$JBOSS_HOME\standalone\configuration\standalone.xmlの<subsystem xmlns="urn:jboss:domain:datasources:1.0">配下の<datasources>セクションに以下の内容を追加します。
<subsystem xmlns="urn:jboss:domain:datasources:1.0">
<datasources>
・・・
<datasource jndi-name="java:jboss/datasources/mysqlDatasource" pool-name="mysqlDatasource" enabled="true" use-java-context="true">
<connection-url>jdbc:mysql://localhost:3306/sampledb</connection-url>
<driver>mysql</driver>
<security>
<user-name>root</user-name>
<password></password>
</security>
</datasource>
<drivers>
・・・
</drivers>
</datasources>
</subsystem>
設定に問題が無ければ、以下のようなログがJBossのログに出力されます。
<datasources>
・・・
<datasource jndi-name="java:jboss/datasources/mysqlDatasource" pool-name="mysqlDatasource" enabled="true" use-java-context="true">
<connection-url>jdbc:mysql://localhost:3306/sampledb</connection-url>
<driver>mysql</driver>
<security>
<user-name>root</user-name>
<password></password>
</security>
</datasource>
<drivers>
・・・
</drivers>
</datasources>
</subsystem>
INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-2) JBAS010400: Bound data source [java:jboss/datasources/mysqlDatasource]
また、管理コンソール上からも有効になっていることが確認できます。
MySQL Connector/Jのバージョンによる<driver>の違い
上に書いた通りですが、Connector/J 5.1.30を境に<driver>の書き方が異なります。これは、5.1.30でMySQL Fabric用のドライバが追加されたためです。その為、5.1.30以降を使用するときはどちらのドライバを使用するのか<driver-class>タグで明示する必要があるようです。明示しない場合、JBossのログで次のログが出力されます。
INFO [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 27) JBAS010404: Deploying non-JDBC-compliant driver class com.mysql.jdbc.Driver (version 5.1)
INFO [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 27) JBAS010404: Deploying non-JDBC-compliant driver class com.mysql.fabric.jdbc.FabricMySQLDriver (version 5.1)
ERROR [org.jboss.as.controller.management-operation] (ServerService Thread Pool -- 27) JBAS014612: Operation ("add") failed - address: ([
("subsystem" => "datasources"),
("jdbc-driver" => "mysql")
]): org.jboss.msc.service.DuplicateServiceException: Service jboss.jdbc-driver.mysql is already registered
<driver-class>に指定する値ですが、mysql-connector-java-5.1.39-bin.jarを展開した後の「META-INF/services/java.sql.Driver」で定義されています。通常のMySQLを使用するときは「com.mysql.jdbc.Driver」を指定するようにしてください。INFO [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 27) JBAS010404: Deploying non-JDBC-compliant driver class com.mysql.fabric.jdbc.FabricMySQLDriver (version 5.1)
ERROR [org.jboss.as.controller.management-operation] (ServerService Thread Pool -- 27) JBAS014612: Operation ("add") failed - address: ([
("subsystem" => "datasources"),
("jdbc-driver" => "mysql")
]): org.jboss.msc.service.DuplicateServiceException: Service jboss.jdbc-driver.mysql is already registered
なお、5.1.29以前を使用する場合は次のように<driver-class>タグは不要です。
<driver name="mysql" module="com.mysql">
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
</driver>
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
</driver>
以上、モジュール組込み方式によるDatasourceの追加方法でした。
今回参考にさせて頂いたサイトは以下の通りです。
- 陸トトの忘れぬ為の備忘録
- JBoss As 7 のDataSource設定方法
- Redhat JBoss Enterprise Application Platform 6 管理および設定ガイド
- 6.7.3. MySQL のデータソースの例
- Stack Overflow
- JBoss AS 7 and MySQL - Can't start server
コメント