一部のデータベースベンダー(MySQL など)は、JDBC ドライバーを OSGi バンドル内で提供しています。お使いのデータベース用の JDBC ドライバーが OSGi バンドルとして提供されていない場合は、ドライバーの JAR を取得して、それを OSGi バンドル内にラップします。このバンドルは、データベースサーバーとの通信に必要となるパッケージをエクスポートしている必要があります。また、バンドルは、参照先のパッケージをインポートしている必要もあります。
次の例では、Bundle plugin for Maven を使用して、HSQLDB ドライバーを OSGi バンドル内にラップします。POM では、このプラグインに対して、hsqldb.jar ファイルを埋め込み、そのファイルを依存関係として識別するように指示します。すべての org.hsqldb パッケージがエクスポートされます。
このプラグインは、インポートすべきパッケージを自動的に決定し、それらをバンドルの MANIFEST.MF ファイルに記載します。CQ サーバー上に存在しないパッケージがある場合、バンドルのインストールは開始されません。この問題に対して、次の 2 つの解決策が考えられます。
- POM で、パッケージがオプションであることを示します。この解決策は、JDBC 接続で実際にはそのパッケージのメンバーが不要である場合に使用します。オプションのパッケージを示すには、次の例のように Import-Package 要素を使用します。
<Import-Package>org.jboss.*;resolution:=optional,*</Import-Package>
- パッケージを含む JAR ファイルを、そのパッケージをエクスポートしている OSGi バンドル内にラップして、そのバンドルをデプロイします。この解決策は、コード実行中にパッケージのメンバーが必要になる場合に使用します。
ソースコードを知ることで、どちらの解決策を使用すべきかを判断できます。また、いずれかの解決策を試してテストを実行し、解決策の妥当性を検証することもできます。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.adobe.example.myapp</groupId> <artifactId>hsqldb-jdbc-driver-bundle</artifactId> <version>0.0.1-SNAPSHOT</version> <name>wrapper-bundle-hsqldb-driver</name> <url>www.adobe.com</url> <description>Exports the HSQL JDBC driver</description> <packaging>bundle</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>1.4.3</version> <extensions>true</extensions> <configuration> <instructions> <Embed-Dependency>*</Embed-Dependency> <_exportcontents>org.hsqldb.*</_exportcontents> </instructions> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>2.2.9</version> </dependency> </dependencies> </project>
JDBC ドライバーを使用してデータソースオブジェクトを作成する JDBC Connections Pool サービスの設定を追加します。アプリケーションコードではこのサービスを使用してデータソースオブジェクトを取得し、データベースに接続します。
JDBC Connections Pool(com.day.commons.datasource.jdbcpool.JdbcPoolService)はファクトリサービスです。異なるプロパティ(読み取り専用アクセスと読み取り/書き込みアクセスなど)を使用する接続が必要な場合は、複数の設定を作成します。
CQ と連携する場合は、いくつかの方法でサービスの設定を管理できます。OSGi の設定を参照してください。
プール化された接続サービスを設定するには、次のプロパティを使用できます。プロパティ名は、Web コンソールに表示されるとおりに示しています。sling:OsgiConfig ノードに対応する名前を括弧内に示しています。値の例は、エイリアスが mydb である HSQLDB サーバーおよびデータベースのものを示しています。
- JDBC Driver Class(jdbc.driver.class):使用する Java クラス。このクラスは java.sql.Driver インターフェイスを実装しています(例:org.hsqldb.jdbc.JDBCDriver)。データタイプは String です。
- JDBC Connection URI(jdbc.connection.uri):接続を作成するために使用するデータベースの URL(例:jdbc:hsqldb:hsql//10.36.79.223:9001/mydb)。URL の形式は、java.sql.DriverManager クラスの getConnection メソッドで有効なものである必要があります。データタイプは String です。
- Username(jdbc.username):データベースサーバーでの認証に使用するユーザー名。データタイプは String です。
- Password(jdbc.password)。ユーザー認証に使用するパスワード。データタイプは String です。
- Validation Query(jdbc.validation.query):接続が成功したかを確認するために使用する SQL 文(例:select 1 from INFORMATION_SCHEMA.SYSTEM_USERS)。データタイプは String です。
- Readonly By Default(default.readonly): この接続を読み取り専用アクセスにする場合に、このオプションを選択します。データタイプは Boolean です。
- Autocommit By Default(default.autocommit):データベースに送信される SQL コマンドごとに別々のトランザクションを作成し、各トランザクションを自動的にコミットする場合に、このオプションを選択します。コード内で明示的にトランザクションをコミットする場合は、このオプションを選択しないでください。データタイプは Boolean です。
- Pool Size(pool.size):データベースに対して作成可能な同時接続数。データタイプは Long です。
- Pool wait(pool.max.wait.msec):接続要求がタイムアウトになるまでの時間。データタイプは Long です。
- Datasource Name(datasource.name):このデータソースの名前。データタイプは String です。
- Additional Service Properties(datasource.svc.properties):接続 URL に追加する名前と値のペアのセット。データタイプは String[] です。
JDBC Connections Pool サービスはファクトリです。そのため、sling:OsgiConfig ノードを使用してこの接続サービスを設定する場合、ノードの名前はファクトリサービスの PID に -alias を付けたものである必要があります。使用するエイリアスは、その PID のすべての設定ノードで一意である必要があります。例として、ノード名は com.day.commons.datasource.jdbcpool.JdbcPoolService-myhsqldbpool のようになります。

Java コードでは、DataSourcePool サービスを使用して、作成した設定に対応する javax.sql.DataSource オブジェクトを取得する必要があります。DataSourcePool サービスには getDataSource メソッドがあり、このメソッドは指定したデータソース名の DataSource オブジェクトを返します。メソッド引数として、JDBC Connections Pool 設定で指定した Datasource Name(または datasource.name)プロパティの値を使用します。
次の JSP コード例では、hsqldbds データソースのインスタンスを取得し、単純な SQL クエリーを実行し、返された結果の個数を表示します。
<%@include file="/libs/foundation/global.jsp"%><% %><%@page session="false"%><% %><%@ page import="com.day.commons.datasource.poolservice.DataSourcePool" %><% %><%@ page import="javax.sql.DataSource" %><% %><%@ page import="java.sql.Connection" %><% %><%@ page import="java.sql.SQLException" %><% %><%@ page import="java.sql.Statement" %><% %><%@ page import="java.sql.ResultSet"%><% %><html> <cq:include script="head.jsp"/> <body> <%DataSourcePool dspService = sling.getService(DataSourcePool.class); try { DataSource ds = (DataSource) dspService.getDataSource("hsqldbds"); if(ds != null) { %><p>Obtained the datasource!</p><% %><%final Connection connection = ds.getConnection(); final Statement statement = connection.createStatement(); final ResultSet resultSet = statement.executeQuery("SELECT * from INFORMATION_SCHEMA.SYSTEM_USERS"); int r=0; while(resultSet.next()){ r=r+1; } resultSet.close(); %><p>Number of results: <%=r%></p><% } }catch (Exception e) { %><p>error! <%=e.getMessage()%></p><% } %></body> </html>
注意:
getDataSource メソッドが、データソースが見つからないことによる例外をスローした場合は、Connections Pool サービスが正しく設定されているかを確認してください。プロパティ名、値およびデータタイプを確認してください。
注意:
DataSourcePool を OSGi バンドルにインジェクションする方法については、Adobe Experience Manager OSGi バンドルへの DataSourcePool サービスのインジェクションを参照してください。