Domanda

L'applicazione CQ5 deve essere collegata ad un RDBMS esterno. Come posso configurare e connettermi a un DataSource JDBC?

Risposta, Soluzione

Come esempio creeremo un DataSource JDBC per connetterci al motore di database H2

Installa il driver JDBC per il database.

  • Se il fornitore del database fornisce un jar di driver JDBC come bundle OSGi, puoi dislocarlo direttamente nella console Felix.
  • Se il bundle OSGi con il driver non è disponibile è possibile aggiungere il jar al percorso di classe condiviso del server applicativo, per esempio crx-quickstart/server/lib/container sotto CQSE, e creare un Extension Bundle.
    • Crea un file manifesto. Per questo esempio lo chiameremo h2ext.mf. Vedi sotto l'elenco dei codici.
      Nota che è richiesta la riga vuota alla fine di un file manifest del jar.
    • Crea un file jar con il manifesto di cui sopra utilizzando il seguente comando.
      jar -cfm org.h2.jdbc.driver.extension-1.1.119.jar h2ext.mf 
    • Installa org.h2.jdbc.driver.extension-1.1.119.jar usando la console Felix. Questo dovrebbe aggiungere il pacchetto org.h2 alla lista di esportazione del System Bundle.
    • Fai riferimento alla sezione 3.15, Extension Bundle, del Core della piattaforma di servizi OSGi per maggiori informazioni sugli Extension Bundle.
  • Un'altra opzione è quella di incorporare il driver jdbc in un altro bundle OSGi. Se stai usando CRXDE per creare un bundle OSGi puoi mettere il jar del driver nella cartella lib del bundle. CRXDE lo incorporerà automaticamente.
  • Un'altra opzione è quella di aggiungere il jar al classpath condiviso del server applicativo e usare la proprietà org.osgi.framework.bootdelegation in sling.propeties per caricare la classe del driver. Fai clic qui per maggiori informazioni. Per esempio, se utilizzi un database H2, copia h2-1.1.119.jar in crx-quickstart/server/lib/container. Quindi aggiungi la riga "sling.bootdelegation.class.org.h2.Driver=org.h2" alle proprietà sling.properties.

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

 

Configura il pool di connessione JDBC

Vai al Configuration Manager della console Felix (http://localhost:4502/system/console/configMgr). Utilizza la configurazione di fabbrica del JDBC Connection Pool per creare un nuovo pool di connessioni. Ad esempio, potrebbe avere le seguenti impostazioni.

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

Ottieni un'istanza del DataSource.

Una volta configurata l'istanza DataSource viene acquisita richiamando il metodo getDataSource(String datasourceName) del servizio DataSourcePool (com.day.commons.datasource.poolservice.DataSourcePool) e passandogli il nome del datasource.

Esempio di componente OSGi

In questo esempio stiamo creando un semplice servizio OSGi che può essere utilizzato per ottenere un'istanza di unaDataSource. Questo esempio non è realistico, in quanto reinventa le stesse API di com.day.commons.datasource.poolservice.DataSourcePool senza aggiungere alcuna funzionalità. Ma mostra come puoi utilizzare DataSourcePool nel tuo codice.

Creiamo prima di tutto un'interfaccia per il nostro servizio.

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

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

Ora l'implementazione. Come puoi vedere, oltre a nascondere la DataSourceNotFoundException non aggiunge alcun valore :).

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;
    }
}

Questa classe sta usando la specifica OSGi Declarative Services per ottenere un'istanza del servizio DataSourcePool e poi chiama il suo getDataSource(dataSourceName) per ottenere il DataSource. Il plugin Maven SCR sta utilizzando le annotazioni scr java per generare i descrittori XML per OSGi Declarative Services. Il file zip allegato contiene l'esempio POM.

Puoi scaricare un esempio completo qui: datasourceutil.zip. Comprende un Maven POM per generarlo. Per costruire questo progetto utilizzando il POM fornito in dotazione fai riferimento a Come utilizzare CQ5 come repository maven.

Esempio JSP

Questo è un pacchetto CRX che contiene un esempio JSP - datasource-example-jsp.zip. È un componente CQ che può essere aggiunto a qualsiasi pagina con un sistema di paragrafi. Può essere utilizzato per testare la vostra connessione DataSource.

5.3 Nota

Qui è riportato un esempio di bundle da compilare con CRXDE / CRXDE Lite che contiene l'oracle driverinstall l'oracle_example_driver.zip, dai un'occhiata a /apps/oracle. Nell'Activator.java carica esplicitamente la classe driver (potrebbe non essere richiesta nelle versioni future). Assicurati di avere il più recente day.commons.datasource.jdbcpool (1.0.8) installato prima di usarlo.

Si applica a

CQ5.2.1, CQ5.3

Scarica

Questo prodotto è concesso in licenza in base alla licenza di Attribuzione-Non commerciale-Condividi allo stesso modo 3.0 Unported di Creative Commons.  I post su Twitter™ e Facebook non sono coperti dai termini di Creative Commons.

Note legali   |   Informativa sulla privacy online