JBoss AS7のDatasourceとしてMySQLを追加するお話の続き。
以前は管理コンソール(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
JBossのホームディレクトリは「$JBOSS_HOME」と表します。実際にはJBossをインストールしたディレクトリ(C:\jboss-as-7.1.1.Finalなど)に読み替えてください。また、スタンドアロン環境とします。

JDBCドライバを追加する
特定のディレクトリへのJDBCドライバの設置とドライバの定義を追加します。
  1. 次の2つのディレクトリを作成する
    • $JBOSS_HOME\modules\com\mysql
    • $JBOSS_HOME\modules\com\mysql\main
  2. $JBOSS_HOME\modules\com\mysql\mainに「mysql-connector-java-5.1.39-bin.jar」を設置する
  3. 同ディレクトリに「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>
  4. $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>
なお、<driver>の書き方についてはMySQL Connector/J のバージョンにより異なります。簡単に解説しているので、興味ある方は本記事下の[MySQL Connector/Jのバージョンによる<driver>の違い]を参照してください。

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のログに出力されます。
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」を指定するようにしてください。

なお、5.1.29以前を使用する場合は次のように<driver-class>タグは不要です。
<driver name="mysql" module="com.mysql">
  <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
</driver>


以上、モジュール組込み方式によるDatasourceの追加方法でした。
今回参考にさせて頂いたサイトは以下の通りです。 上2つのサイトを中心に見ていましたがどうしてもうまくいかなくて、管理コンソールからやってみたりと寄り道しましたが、「JBoss DuplicateServiceException」で検索をして見つかったStack Overflowの記事でやっと解決しました。