SQL データベースへの接続

次の手順で外部 SQL データベースにアクセスして、CQ アプリケーションがデータを操作できるようにします。

  1. JDBC ドライバーパッケージを書き出す OSGi バンドルを作成または取得します
  2. JDBC データソースプールプロバイダーを設定します
  3. データソースオブジェクトを取得し、コード内で接続を作成します

JDBC データベースドライバーのバンドル

一部のデータベースベンダーは、OSGiバンドルにJDBCドライバーを提供しています(例:MySQL)。データベースの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 バンドル内にラップして、そのバンドルをデプロイします。この解決策は、コード実行中にパッケージのメンバーが必要になる場合に使用します。

ソースコードを知ることで、どちらの解決策を使用すべきかを判断できます。また、いずれかの解決策を試してテストを実行し、解決策の妥当性を検証することもできます。

hsqldb.jar をバンドルする POM

<project xmlns="https://maven.apache.org/POM/4.0.0"
  xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://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 Connection Pool サービスの設定

JDBCドライバーを追加使用してデータソースオブジェクトを作成する、JDBC接続プールサービスの設定。アプリケーションコードは、このサービスを使用してオブジェクトを取得し、データベースに接続します。

JDBC Connections Pool(com.day.commons.datasource.jdbcpool.JdbcPoolService)はファクトリサービスです。異なるプロパティ(読み取り専用アクセスと読み取り/書き込みアクセスなど)を使用する接続が必要な場合は、複数の設定を作成します。

CQ と連携する場合は、いくつかの方法でサービスの設定を管理できます。OSGi の設定を参照してください。

プール化された接続サービスを設定するには、次のプロパティを使用できます。プロパティ名は、Web コンソールに表示されるとおりに示しています。sling:OsgiConfig ノードに対応する名前を括弧内に示しています。値の例は、エイリアスが mydb である HSQLDB サーバーおよびデータベースのものを示しています。

  • JDBCドライバークラス(jdbc.driver.class):java.sql.Driverインターフェイスを実装するために使用するJavaクラス(例:org.hsqldb.jdbc.JDBCDriver)。 データタイプはStringです。

  • JDBC接続URI ( jdbc.connection.uri):接続の作成に使用するデータベースのURLです(例:jdbc:hsqldb:hsql/10.36.79.223:9001/mydb)。 URLの形式は、java.sql.DriverManagerクラスのgetConnectionメソッドで使用するために有効である必要があります。 データタイプはStringです。

  • ユーザー名(jdbc.username):データベースサーバーの認証に使用するユーザー名です。 データタイプはStringです。

  • パスワード(jdbc.password):ユーザーの認証に使用するパスワードです。 データタイプはStringです。

  • 検証クエリ(jdbc.validation.query):接続が成功したことを検証するために使用するSQLステートメント(例:select 1 from INFORMATION_SCHEMA.SYSTEM_USERS)。 データタイプはStringです。

  • Readonly By Default(default.readonly): この接続を読み取り専用アクセスにする場合に、このオプションを選択します。データタイプは Boolean です。

  • デフォルトで自動コミット(default.autocommit):データベースに送信されるSQLコマンドごとに個別のトランザクションを作成し、各トランザクションを自動的にコミットする場合は、このオプションを選択します。 コード内でトランザクションを明示的にコミットする場合は、このオプションを選択しないでください。 データタイプはBooleanです。

  • プールサイズ(pool.size):データベースで同時に使用できる接続の数。 データタイプはLongです。

  • プールの待機(pool.max.wait.msec):接続要求がタイムアウトするまでの時間。 データタイプはLongです。

  • データソース名(datasource.name):このデータソースの名前。 データタイプはStringです。

  • 追加のサービスプロパティ(datasource.svc.properties):接続URLに追加する名前と値のペアのセット。 データタイプはString[]です。

JDBC接続プールサービスはファクトリです。 したがって、sling:OsgiConfigノードを使用して接続サービスを設定する場合、ノードの名前にはファクトリサービスのPIDの後に​-alias​が続く必要があります。 使用するエイリアスは、そのPIDのすべての設定ノードで一意である必要があります。 ノード名の例はcom.day.commons.datasource.jdbcpool.JdbcPoolService-myhsqldbpoolです。

chlimage_1-7

データベースへの接続

Java コードでは、DataSourcePool サービスを使用して、作成した設定に対応する javax.sql.DataSource オブジェクトを取得する必要があります。DataSourcePool サービスには getDataSource メソッドがあり、このメソッドは指定したデータソース名の DataSource オブジェクトを返します。メソッド引数として、JDBC Connections Pool 設定で指定した Datasource Name(または datasource.name)プロパティの値を使用します。

次の JSP コード例では、hsqldbds データソースのインスタンスを取得し、単純な SQL クエリを実行し、返された結果の個数を表示します。

データベースのルックアップを実行する JSP

<%@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>
NOTE

getDataSource メソッドが、データソースが見つからないことによる例外をスローした場合は、Connections Pool サービスが正しく設定されているかを確認してください。プロパティ名、値およびデータタイプを確認してください。

NOTE

DataSourcePool を OSGi バンドルにインジェクションする方法については、Adobe Experience Manager OSGi バンドルへの DataSourcePool サービスのインジェクションを参照してください。

このページ