Conexión a bases de datos SQL connecting-to-sql-databases
Acceda a una base de datos SQL externa a para que sus aplicaciones CQ puedan interactuar con los datos:
Agrupación del controlador de base de datos JDBC bundling-the-jdbc-database-driver
Algunos proveedores de bases de datos proporcionan controladores JDBC en un paquete OSGi, por ejemplo MySQL. Si el controlador JDBC de la base de datos no está disponible como paquete OSGi, obtenga el JAR del controlador y encapsúlelo en un paquete OSGi. El paquete debe exportar los paquetes necesarios para interactuar con el servidor de base de datos. El paquete también debe importar los paquetes a los que hace referencia.
El ejemplo siguiente utiliza la variable Complemento de paquetes para Maven para envolver el controlador HSQLDB en un paquete OSGi. El POM ordena al complemento que incruste el archivo hsqldb.jar que está identificado como una dependencia. Se exportan todos los paquetes org.hsqldb.
El complemento determina automáticamente qué paquetes se van a importar y los enumera en el archivo MANIFEST.MF del paquete. Si alguno de los paquetes no está disponible en el servidor CQ, el paquete no se iniciará al instalar. Dos soluciones posibles son las siguientes:
-
Indique en el POM que los paquetes son opcionales. Utilice esta solución cuando la conexión JDBC no requiera realmente los miembros del paquete. Utilice el elemento Import-Package para indicar paquetes opcionales como en el siguiente ejemplo:
<Import-Package>org.jboss.*;resolution:=optional,*</Import-Package>
-
Envuelva los archivos JAR que contienen los paquetes en un paquete OSGi que exporta los paquetes e implemente el paquete. Utilice esta solución cuando los miembros del paquete sean necesarios durante la ejecución del código.
El conocimiento del código fuente le permite decidir qué solución utilizar. También puede probar cualquiera de las soluciones y realizar pruebas para validar la solución.
POM que agrupa hsqldb.jar pom-that-bundles-hsqldb-jar
<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>
Los siguientes vínculos abren las páginas de descarga de algunos productos de base de datos populares:
Configuración del servicio JDBC Connection Pool configuring-the-jdbc-connection-pool-service
Agregue una configuración para el servicio Agrupamiento de conexiones JDBC que use el controlador JDBC para crear objetos de fuente de datos. El código de la aplicación utiliza este servicio para obtener el objeto y conectarse a la base de datos.
Grupo de conexiones JDBC ( com.day.commons.datasource.jdbcpool.JdbcPoolService
) es un servicio de fábrica. Si necesita conexiones que utilicen propiedades diferentes, por ejemplo, acceso de solo lectura o de lectura y escritura, cree varias configuraciones.
Al trabajar con CQ existen varios métodos para administrar los ajustes de configuración de dichos servicios; see Configuración de OSGi para obtener más información.
Las siguientes propiedades están disponibles para configurar un servicio de conexión en grupo. Los nombres de las propiedades aparecen tal como aparecen en la Consola Web. El nombre correspondiente de un sling:OsgiConfig
aparece entre paréntesis. Se muestran valores de ejemplo para un servidor HSQLDB y una base de datos que tiene un alias de mydb
:
-
Clase de controlador JDBC (
jdbc.driver.class
): La clase Java que se va a usar que implementa la interfaz java.sql.Driver, por ejemploorg.hsqldb.jdbc.JDBCDriver
. El tipo de datos esString
. -
URI de conexión JDBC (
jdbc.connection.uri
): La URL de la base de datos que se utiliza para crear la conexión, por ejemplojdbc:hsqldb:hsql//10.36.79.223:9001/mydb
. El formato de la dirección URL debe ser válido para utilizarse con el método getConnection de la clase java.sql.DriverManager. El tipo de datos esString
. -
Nombre de usuario (
jdbc.username
): El nombre de usuario que se utiliza para autenticarse con el servidor de base de datos. El tipo de datos esString
. -
Contraseña (
jdbc.password
): La contraseña que se utilizará para la autenticación del usuario. El tipo de datos esString
. -
Consulta de validación (
jdbc.validation.query
): La instrucción SQL que se utiliza para verificar que la conexión se ha realizado correctamente, por ejemploselect 1 from INFORMATION_SCHEMA.SYSTEM_USERS
. El tipo de datos esString
. -
Léame de forma predeterminada (default.readonly): Seleccione esta opción cuando desee que la conexión proporcione acceso de solo lectura. El tipo de datos es
Boolean
. -
Autoconfirmar De Forma Predeterminada (
default.autocommit
): Seleccione esta opción para crear transacciones independientes para cada comando SQL enviado a la base de datos y cada transacción se compromete automáticamente. No seleccione esta opción cuando esté cometiendo transacciones explícitamente en el código. El tipo de datos esBoolean
. -
Tamaño del grupo (
pool.size
): Número de conexiones simultáneas que se pondrán a disposición de la base de datos. El tipo de datos esLong
. -
Espera de grupo (
pool.max.wait.msec
): Cantidad de tiempo antes de que se agote el tiempo de espera de una solicitud de conexión. El tipo de datos esLong
. -
Nombre del origen de datos (
datasource.name
): Nombre de esta fuente de datos. El tipo de datos esString
. -
Propiedades de servicio adicionales (
datasource.svc.properties
): Conjunto de pares de nombre/valor que desea adjuntar a la dirección URL de conexión. El tipo de datos esString[]
.
El servicio JDBC Connections Pool es una fábrica. Por lo tanto, si utiliza un sling:OsgiConfig
para configurar el servicio de conexión, el nombre del nodo debe incluir el PID del servicio de fábrica seguido de -alias
. El alias que utilice debe ser único para todos los nodos de configuración de ese PID. Un nombre de nodo de ejemplo es com.day.commons.datasource.jdbcpool.JdbcPoolService-myhsqldbpool
.
Conexión a la base de datos connecting-to-the-database
En su código Java, utilice el servicio DataSourcePool para obtener un javax.sql.DataSource
para la configuración que ha creado. El servicio DataSourcePool proporciona la variable getDataSource
método que devuelve un DataSource
para un nombre de origen de datos determinado. Como argumento del método, utilice el valor del nombre del origen de datos (o datasource.name
) propiedad que especificó para la configuración del grupo de conexiones JDBC.
El siguiente ejemplo de código JSP obtiene una instancia del origen de datos hsqldbds, ejecuta una consulta SQL simple y muestra el número de resultados que se devuelven.
JSP que realiza una búsqueda de base de datos jsp-that-performs-a-database-lookup
<%@include file="/libs/foundation/global.jsp"%><%
%><%@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>