連接到SQL資料庫

存取外部SQL資料庫,讓您的CQ應用程式可與資料互動:

  1. 建立或獲取導出JDBC驅動程式包的OSGi包
  2. 配置JDBC資料源池提供程式
  3. 取得資料來源物件並在程式碼中建立連線

捆綁JDBC資料庫驅動程式

某些資料庫供應商在OSGi包中提供JDBC驅動程式,例如MySQL。 如果資料庫的JDBC驅動程式不能作為OSGi包,請獲取驅動程式JAR並將其包在OSGi包中。 Bundle必須導出與資料庫伺服器交互所需的包。 包還必須導入它引用的包。

以下示例使用Maven](https://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html)的[Bundle插件將HSQLDB驅動程式包在OSGi包中。 POM指示插件嵌入標識為相關性的hsqldb.jar檔案。 所有org.hsqldb包都將導出。

外掛程式會自動決定要匯入的封裝,並將它們列在封裝的MANIFEST.MF檔案中。 如果CQ伺服器上沒有任何軟體包,則在安裝時將不啟動軟體包。 兩種可能的解決方案如下:

  • 在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連接池服務

為使用JDBC驅動程式建立資料源對象的JDBC連接池服務添加配置。 您的應用程式碼使用此服務獲取對象並連接到資料庫。

JDBC連接池(com.day.commons.datasource.jdbcpool.JdbcPoolService)是工廠服務。 如果需要使用不同屬性(例如只讀或讀/寫訪問)的連接,請建立多個配置。

使用CQ時,管理此類服務的配置設定有幾種方法;如需詳細資訊,請參閱設定OSGi

以下屬性可用於配置共用連接服務。 屬性名稱會列在Web控制台中顯示的位置。 sling:OsgiConfig節點的對應名稱將出現在括弧中。 HSQLDB伺服器和別名為mydb的資料庫的示例值如下:

  • 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

  • 預設情況下為只讀(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連接池配置指定的資料源名稱(或datasource.name)屬性的值。

以下示例JSP代碼獲取hsqldbds資料源的實例,執行簡單SQL查詢,並顯示返回的結果數。

執行資料庫查找的JSP

<%@include file="/libs/foundation/global.jsp?lang=zh-Hant"%><%
%><%@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方法由於找不到資料來源而引發異常,請確定連線池服務設定正確。 驗證屬性名稱、值和資料類型。

注意

如要瞭解如何將DataSourcePool注入OSGi捆綁包中,請參閱將DataSourcePool服務注入Adobe Experience Manager OSGi捆綁包

本頁內容

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