Pregunta

Mi aplicación CQ5 necesita conectarse a un RDBMS externo. ¿Configuro y me conecto a una fuente de datos JDBC?

Respuesta y resolución

Como ejemplo, crearemos una fuente de datos JDBC para conectarnos al motor de base de datos H2

Instale el controlador JDBC para su base de datos.

  • Si su proveedor de bases de datos proporciona un tarro de controlador JDBC como un paquete OSGi, puede desplegarlo directamente en Felix Console.
  • Si el paquete OSGi con su controlador no está disponible, puede añadir el jar a la ruta de clase compartida de su servidor de aplicaciones, por ejemplo crx-quickstart/server/lib/container en CQSE, y crear un paquete de extensión.
    • Crear un archivo de manifiesto. Para este ejemplo lo llamaremos h2ext.mf. Vea abajo la lista de códigos.
      Tenga en cuenta que se requiere una línea en blanco al final de un archivo jar de manifiesto.
    • Cree un archivo jar con el manifiesto anterior utilizando el siguiente comando.
      jar -cfm org.h2.jdbc.driver.extension-1.1.119.jar h2ext.mf 
    • Instale org.h2.jdbc.driver.extension-1.1.119.jar usando Felix Console. Esto debería añadir el paquete org.h2 a la lista de exportación del paquete de sistemas.
    • Consulte la sección 3.15, Paquetes de extensión, del núcleo de la plataforma de servicios OSGi para obtener más información sobre los paquetes de extensión.
  • Otra opción es integrar el controlador jdbc en otro paquete OSGi. Si está usando CRXDE para crear un paquete OSGi, puede poner el jar del controlador en el directorio bundle lib. CRXDE lo insertará automáticamente.
  • Otra opción es añadir el tarro a la ruta de clase compartida de su servidor de aplicaciones y utilizar la propiedad org.osgi.framework.bootdelegation en sling.propeties para cargar la clase de controlador. Haga clic aquí para obtener más información. Por ejemplo, si está utilizando una base de datos H2, copie h2-1.1.119.jar en crx-quickstart/server/lib/container. A continuación, añada la línea “sling.bootdelegation.class.org.h2.Driver=org.h2” a 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

 

Configurar el Pool de conexiones JDBC

Navegue hasta el Administrador de cofiguración en la consola Felix (http://localhost:4502/system/console/configMgr). Utilice la configuración de fábrica de JDBC Connection Pool para crear un nuevo grupo de conexiones. Por ejemplo, puede tener los siguientes ajustes.

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

Obtener una instancia del DataSource.

Una vez configurada la instancia DataSource se adquiere llamando al método getDataSource(String datasourceName) del servicio DataSourcePool (com.day.commons.datasource.poolservice.DataSourcePool) y se pasa el nombre del origen de datos.

Ejemplo de Componente OSGi

En este ejemplo estamos creando un servicio OSGi simple que puede ser usado para obtener una instancia de un DataSource. Este ejemplo no es realista, ya que básicamente reinventa la misma API que com.day.commons.datasource.poolservice.DataSourcePool mismo sin añadir ninguna funcionalidad. Pero muestra cómo se puede utilizar DataSourcePool en su propio código.

Primero vamos a crear una interfaz para nuestro servicio.

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

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

Ahora la implementación. Como puede ver, además de ocultar el DataSourceNotFoundException, no añade ningún valor :).

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

Esta clase está usando la especificación de OSGi Declarative Services para obtener una instancia del servicio DataSourcePool y luego llama a su getDataSource(dataSourceName) para obtener el DataSource. Maven SCR Plugin está usando las anotaciones scr java para generar los descriptores XML para OSGi Declarative Services. El archivo zip adjunto contiene el ejemplo POM.

Puede descargar un ejemplo completo aquí: datasourceutil.zip. Incluye un Maven POM para construirlo. Para construir este proyecto usando el POM proporcionado, consulte Usar CQ5 como repositorio de maven.

Ejemplo de JSP

Este es un paquete CRX que contiene un ejemplo JSP: datasource-example-jsp.zip. Es un componente CQ que puede ser añadido a cualquier página con un sistema de párrafos. Se puede utilizar para probar la conexión DataSource.

Nota de 5.3

Añadido un paquete de ejemplo para construir con CRXDE / CRXDE Lite que contiene el controlador oracle, instale oracle_example_driver.zip, ver /apps/oracle.java y cargue explícitamente la clase de controlador (puede que no sea necesario en futuras versiones). Asegúrese de tener instalado el último día.commons.datasource.jdbcpool (1.0.8) antes de usarlo.

Se aplica a

CQ5.2.1, CQ5.3

Descargar

Esta obra está autorizada con arreglo a la licencia de Reconocimiento-NoComercial-CompartirIgual 3.0 Unported de Creative Commons.  Los términos de Creative Commons no cubren las publicaciones en Twitter™ y Facebook.

Avisos legales   |   Política de privacidad en línea