Frage

Meine CQ5-Anwendung muss sich mit einem externen RDBMS verbinden. Wie konfiguriere ich und stelle eine Verbindung zu einer JDBC-Datenquelle her?

Antwort, Auflösung

Als Beispiel erstellen wir eine JDBC-Datenquelle, um eine Verbindung mit H2 Datenbank-Engine herzustellen.

Installieren Sie den JDBC-Treiber für Ihre Datenbank.

  • Wenn Ihr Datenbankanbieter ein JDBC-Treiber-JAR als OSGi-Bundle zur Verfügung stellt, können Sie es direkt in die Felix-Konsole einbinden.
  • Wenn das OSGi-Bundle mit Ihrem Treiber nicht verfügbar ist, können Sie das JAR zum gemeinsamen Klassenpfad Ihres Anwendungsservers hinzufügen z.B. crx-quickstart/server/lib/container unter CQSE und ein Extension-Bundle erstellen.
    • Erstellen Sie eine Manifestdatei. Für dieses Beispiel nennen wir es h2ext.mf. Siehe untenstehende Codeliste.
      Beachten Sie, dass eine leere Zeile am Ende einer JAR-Manifestdatei erforderlich ist.
    • Erstellen Sie eine JAR-Datei mit obigem Manifest unter Verwendung des folgenden Befehls.
      jar -cfm org.h2.jdbc.driver.extension-1.1.119.jar h2ext.mf 
    • Installieren Sie org.h2.jdbc.driver.extension-1.1.119.jar mithilfe der Felix-Konsole. Dies sollte das org.h2 package zur Exportliste des System-Bundles hinzufügen.
    • Weitere Informationen zu Extension-Bundles finden Sie in Abschnitt 3.15, Extension Bundles, der OSGi-Kerndienstplattform.
  • Eine weitere Möglichkeit besteht darin, den jdbc-Treiber in ein anderes OSGi-Bundle einzubetten. Wenn Sie CRXDE verwenden, um ein OSGi-Bundle zu erstellen, können Sie den Treiber JAR in das Bundle-Lib-Verzeichnis einfügen. CRXDE wird ihn automatisch einbetten.
  • Alternativ können Sie die JAR dem gemeinsamen Klassenpfad Ihres Anwendungsservers hinzufügen und die Eigenschaft org.osgi.framework.bootdelegation in sling.propeties verwenden, um die Treiberklasse zu laden. Klicken Sie hier für weitere Informationen. Wenn Sie beispielsweise H2 Database verwenden, kopieren Sie h2-1.1.119.jar nach crx-quickstart/server/lib/container. Fügen Sie anschließend den sling.properties die Zeile „sling.bootdelegation.class.org.h2.Driver=org.h2“ hinzu.

h2ext.mf

Bundle-ManifestVersion: 2
Bundle-SymbolicName: org.h2.jdbc.driver.extension
Bundle-Version: 1.1.119
Fragment-Host: system.bundle; extension:=framework
Bundle-Name: H2 JDBC Driver Extension
Bundle-Description: Bundle exporting H2 JDBC Driver
Export-Package: org.h2

 

JDBC Connection Pool konfigurieren

Navigieren Sie zum Konfigurationsmanager in der Felix-Konsole (http://localhost:4502/system/console/configMgr). Erstellen Sie mithilfe der JDBC-Connection-Pool-Konfigurationsfabrik einen neuen Connection Pool. Es könnten zum Beispiel diefolgenden Einstellungen vorliegen.

JDBC driver class: org.h2.Driver
JDBC connection URI: jdbc:h2:~/test
Usename: sa
Password:
Validation query:
Pool size: 10
Pool wait (msec): 100
Datasource name: h2DataSource

Eine Instanz der Datenquelle aufrufen.

Nachdem die DataSource konfiguriert wurde, wird sie durch Aufrufen der getDataSource(String datasourceName)-Methode des DataSourcePool-Service (com.day.commons.datasource.poolservice.DataSourcePool) ausgelöst und gibt ihm den Datenquellennamen.

Beispiel einer OSGi-Komponente

In diesem Beispiel erstellen wir einen einfachen OSGi-Service, der zum Abrufen einer Instanz einer Datenquelle verwendet werden kann. Dieses Beispiel ist nicht realistisch, da es im Wesentlichen dieselbe API wie com.day.commons.datasource.poolservice.DataSourcePool selbst aufweist, ohne Funktionen hinzuzufügen. Es zeigt jedoch, wie DataSourcePool in Ihrem eigenen Code verwendet werden kann.

Erstellen wir zunächst eine Schnittstelle für unseren Dienst.

package com.day.test.datasource;
import javax.sql.DataSource;

public interface DatasourceUtil {
    public DataSource getDataSource(String dataSourceName);
}

Nun die Implementierung. Wie Sie sehen können, trägt dies außer dem Ausblenden der DataSourceNotFoundException keinen Nutzen bei :).

package com.day.test.datasource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.sql.DataSource;

import com.day.commons.datasource.poolservice.DataSourceNotFoundException;
import com.day.commons.datasource.poolservice.DataSourcePool;

/**
 *
 * This class is an example if how DataSourcePool can be used to obtain the DataSource.
 *
 * @scr.component immediate="true" metatype="no"
 * @scr.service interface="DatasourceUtil"
 * @scr.property name="service.description" value="Data Source lookup example"
 * @scr.property name="service.vendor" value="Day Software"
 */

public class DatasourceUtilImpl implements DatasourceUtil {
    private static final Logger log = LoggerFactory.getLogger(
            DatasourceUtilImpl.class);

    /** @scr.reference policy="static" */
    private DataSourcePool dataSourceService;

    public DataSource getDataSource(String dataSourceName) {
        log.info("Using DataSourcePool service lookup " +
                "to get connection pool " + dataSourceName); 
        DataSource dataSource = null;
        try {
            dataSource = (DataSource) dataSourceService.getDataSource(
                    dataSourceName);
        } catch (DataSourceNotFoundException e) {
            log.error("Unable to find datasource {}.", dataSourceName, e);
        }
        return dataSource;
    }
}

Diese Klasse verwendet die OSGi-Spezifikation für deklarative Dienste, um eine Instanz des DataSourcePool-Dienstes zu erhalten. Diese nennt sie getDataSource(dataSourceName), um die Datenquelle zu erhalten. Maven SCR-Plug-in verwendet die SCR Java-Anmerkungen, um XML-Deskriptoren für deklarative Dienste von OSGi zu erstellen. Die angehängte ZIP-Datei enthält ein Beispiel-POM.

Sie können ein vollständiges Beispiel hier herunterladen: datasourceutil.zip. Es enthält eine Maven-POM zum Erstellen. Um dieses Projekt mit POM zu erstellen, lesen Sie bitte unter "CQ5 als Maven-Repository verwenden" nach.

JSP-Beispiel.

Dies ist ein CRX-Paket, das ein JSP-Beispiel enthält - datasource-example-jsp.zip. Es ist eine CQ-Komponente, die jeder Seite mit einem Absatzsystem hinzugefügt werden kann. Sie kann zum Testen Ihrer DataSource-Verbindung verwendet werden.

5.3 Hinweis

Beigefügt ist ein Beispielbündel zum Aufbau mit CRXDE/CRXDE Lite hinzugefügt, das den Oracle Treiberinstallierer oracle_example_driver.zip enthält, schauen Sie sich die /apps/oracle.In the Activator.java it an, laden Sie explizit die Treiber-Klasse (möglicherweise in zukünftigen Versionen nicht mehr erforderlich). Stellen Sie vor der Verwendung sicher, dass Sie die neueste day.commons.datasource.jdbcpool (1.0.8) installiert haben.

Gilt für

CQ5.2.1, CQ5.3

Herunterladen

Dieses Werk unterliegt den Bedingungen der Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.  Twitter™- und Facebook-Beiträge fallen nicht unter die Bedingungen der Creative Commons-Lizenz.

Rechtliche Hinweise   |   Online-Datenschutzrichtlinie