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?lang=ja"%><%
%><%@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 サービスのインジェクションを参照してください。

このページ

Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now