nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

JBoss ASのデータソース設定

JBoss Advent Calendar 2011の5日目のエントリです。今日はデータソースについて解説します。一応ターゲットとするバージョンはJBoss AS 5, 6系ということにします。JBoss AS 7では記述フォーマットは異なりますが各設定要素は大体一緒なのでAS7でも応用が効くでしょう。以下JBoss ASは5系または6系という前提で書きます。

JBoss ASでは [任意の名前]-ds.xml というデータソース設定ファイルをデプロイすることでデータソースが利用できるようになります。まずはこの最低限かつ典型的なデータソース設定の例を以下に挙げます。例ではPostgreSQLを使用しています。

<?xml version="1.0" encoding="UTF-8"?>

<datasources>
  <local-tx-datasource>
    <jndi-name>PostgresDS</jndi-name>
    <connection-url>jdbc:postgresql://[servername]:[port]/[database name]</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <user-name>x</user-name>
    <password>y</password>
    <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.PostgreSQLValidConnectionChecker</valid-connection-checker-class-name>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.PostgreSQLExceptionSorter</exception-sorter-class-name>
<!--
    <set-tx-query-timeout>true</set-tx-query-timeout>
-->
    <min-pool-size>5</min-pool-size>
    <max-pool-size>40</max-pool-size>
    <blocking-timeout-millis>5000</blocking-timeout-millis>
    <prepared-statement-cache-size>100</prepared-statement-cache-size>
    <metadata>
      <type-mapping>PostgreSQL 8.0</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

英語の説明は以下にあります。

http://community.jboss.org/wiki/ConfigDataSources

  • <jndi-name>
    • データソースのJNDI名を指定します。データソースはJNDI上リモートアクセス不可なので、Java VMローカルJNDIコンテキスト、つまり"java:"以下にバインドされます。上の例では"java:PostgresDS"となります。
  • <connection-url>
    • データベースの接続URLを指定します。接続URLのフォーマットはデータベース依存であり、URL末尾に?foo=barのようにパラメータを付与することで設定を記述することもできるようになっているデータベースが多いです(が、設定の見通しが悪くなるので<connection-property>要素を使う方が賢明です)。
  • <driver-class>
    • JDBCドライバのドライバクラスを指定します。実はJDBCではServiceLoaderを使用してJDBCドライバのjarファイルに含まれるMETA-INF/services/java.sql.Driverファイルからドライバクラスを自動認識してURLと対応付けるので、よほど古いJDBCドライバを利用している、というようなことが無い限りここの指定は間違っててもServiceLoader側で正しいものが登録されているはずなので動きます。後方互換と歴史的都合によりJBoss AS側で必須指定項目になっているので、省略することは残念ながらできません。
  • <user-name>と<password>
    • 説明するまでもないですね。データベース接続に利用するユーザ名とパスワードです。パスワードを平文で書きたくない場合は暗号化することもできます。後日紹介するかもしれません。
  • <valid-connection-checker-class-name>
    • コネクションの障害検出を行うためのクラスです。<valid-connection-checker-class-name>を指定する方法の他に、<check-valid-connection-sql>select 1</check-valid-connection-sql>というように障害検知に利用するSQLを指定するものもあります。開発時にはあってもなくても構いませんが、試験以降は<valid-connection-checker-class-name>と<check-valid-connection-sql>のどちらかは絶対指定するようにしましょう。指定が無いとコネクションの障害検知をしない、ということになります。
  • <exception-sorter-class-name>
    • クエリ発行時などにJDBCドライバから返却されたSQLExceptionのエラーコードやエラーメッセージを元に、コネクションの致命的エラーを判断するクラスです。このクラスを指定しておくことでJBoss ASはコネクションの致命的エラーが起きたときに、再度コネクションのチェックするまでもなくその場でコネクションを捨てる、という判断ができます。指定しておくことで障害検出を早くできる、という性格のプラグインです。
  • <set-tx-query-timeout>
  • <min-pool-size>と<max-pool-size>
    • コネクションプールのサイズ指定です。今時コネクションをケチる理由も無いと思うので、たっぷり指定しておけば良いと思います。
  • <blocking-timeout-millis>
    • コネクションプールに利用可能なコネクションが無いときに、最大何ミリ秒コネクションの返却を待つかを指定します。待ってもコネクションが取得できなかった場合はjavax.resource.ResourceExceptionがスローされます。
  • <prepared-statement-cache-size>
    • PreparedStatementのキャッシュサイズ指定です。こちらもケチる理由はないはずなので、たっぷり指定しておけば良いと思います。
  • <metadata>と<type-mapping>
    • EJB2のCMPエンティティビーンとEJB Timerでデータベースが利用されるので、それらの機能に対してデータベース情報のヒントを与えるための設定です。EJB2 CMPやEJB Timerを使うことは稀だと思いますが、おまじないとして指定しておいてください。


次回からはデータソース設定をもうちょっと踏み込んで見ていきましょう。