Acesse um banco de dados SQL externo no para que seus aplicativos de CQ possam interagir com os dados:
Alguns fornecedores de banco de dados fornecem drivers JDBC em um pacote OSGi, por exemplo MySQL. Se o driver JDBC do seu banco de dados não estiver disponível como um pacote OSGi, obtenha o JAR do driver e coloque-o em um pacote OSGi. O pacote deve exportar os pacotes necessários para interagir com o servidor de banco de dados. O pacote também deve importar os pacotes aos quais faz referência.
O exemplo a seguir usa o Plug-in de pacote para Maven para envolver o driver HSQLDB em um pacote OSGi. O POM instrui o plug-in a incorporar o arquivo hsqldb.jar identificado como uma dependência. Todos os pacotes org.hsqldb são exportados.
O plug-in determina automaticamente quais pacotes devem ser importados e os lista no arquivo MANIFEST.MF do pacote. Se qualquer um dos pacotes não estiver disponível no servidor CQ, o pacote não será iniciado na instalação. Duas soluções possíveis são as seguintes:
Indique no POM que os pacotes são opcionais. Use esta solução quando a conexão JDBC não exigir realmente os membros do pacote. Use o elemento Import-Package para indicar pacotes opcionais, como no exemplo a seguir:
<Import-Package>org.jboss.*;resolution:=optional,*</Import-Package>
Envolva os arquivos JAR que contêm os pacotes em um pacote OSGi que exporta os pacotes e implante o pacote. Use esta solução quando os membros do pacote forem necessários durante a execução do código.
O conhecimento do código-fonte permite decidir qual solução usar. Você também pode experimentar qualquer uma das soluções e executar testes para validar a solução.
<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>
Os links a seguir abrem as páginas de download de alguns produtos de banco de dados populares:
Adicione uma configuração para o serviço Pool de Conexões JDBC que usa o driver JDBC para criar objetos de origem de dados. O código do aplicativo usa esse serviço para obter o objeto e conectar-se ao banco de dados.
Pool de Conexões JDBC ( com.day.commons.datasource.jdbcpool.JdbcPoolService
) é um serviço de fábrica. Se você precisar de conexões que usam propriedades diferentes, por exemplo, acesso somente leitura ou de leitura/gravação, crie várias configurações.
Ao trabalhar com o CQ, há vários métodos de gerenciamento das definições de configuração desses serviços; consulte Configuração do OSGi para obter detalhes completos.
As seguintes propriedades estão disponíveis para configurar um serviço de conexão em pool. Os nomes das propriedades são listados à medida que aparecem no Console da Web. O nome correspondente de um sling:OsgiConfig
aparece entre parênteses. Os valores de exemplo são mostrados para um servidor HSQLDB e um banco de dados que tem um alias de mydb
:
Classe de driver JDBC ( jdbc.driver.class
): A classe Java™ a ser usada que implementa a interface java.sql.Driver, por exemplo org.hsqldb.jdbc.JDBCDriver
. O tipo de dados é String
.
URI da conexão JDBC ( jdbc.connection.uri
): O URL do banco de dados a ser usado para criar a conexão, por exemplo jdbc:hsqldb:hsql//10.36.79.223:9001/mydb
. O formato do URL deve ser válido para uso com o método getConnection da classe java.sql.DriverManager. O tipo de dados é String
.
Nome de usuário ( jdbc.username
): O nome de usuário a ser usado para autenticar com o servidor de banco de dados. O tipo de dados é String
.
Senha ( jdbc.password
): A senha a ser usada para autenticação do usuário. O tipo de dados é String
.
Consulta de validação ( jdbc.validation.query
): A instrução SQL a ser usada para verificar se a conexão foi bem-sucedida, por exemplo select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
. O tipo de dados é String
.
Somente leitura por padrão (default.readonly): selecione essa opção quando quiser que a conexão forneça acesso somente leitura. O tipo de dados é Boolean
.
Autocommit Por Padrão ( default.autocommit
): Selecione esta opção para criar transações separadas para cada comando SQL enviado ao banco de dados e cada transação é automaticamente submetida a commit. Não selecione essa opção quando estiver confirmando transações explicitamente no código. O tipo de dados é Boolean
.
Tamanho do Pool ( pool.size
): O número de conexões simultâneas a serem disponibilizadas para o banco de dados. O tipo de dados é Long
.
Espera do pool ( pool.max.wait.msec
): O tempo antes que uma solicitação de conexão expire. O tipo de dados é Long
.
Nome da fonte de dados ( datasource.name
): O nome dessa fonte de dados. O tipo de dados é String
.
Propriedades do Serviço Adicional ( datasource.svc.properties
): um conjunto de pares de nome/valor que você deseja anexar ao URL de conexão. O tipo de dados é String[]
.
O serviço Pool de Conexões JDBC é uma fábrica. Portanto, se você usar um sling:OsgiConfig
para configurar o serviço de conexão, o nome do nó deve incluir o PID do serviço de fábrica seguido por -alias
. O alias usado deve ser exclusivo para todos os nós de configuração para esse PID. Um exemplo de nome de nó é com.day.commons.datasource.jdbcpool.JdbcPoolService-myhsqldbpool
.
Em seu código Java™, use o serviço DataSourcePool para obter um javax.sql.DataSource
para a configuração criada. O serviço DataSourcePool fornece a getDataSource
método que retorna um DataSource
para um determinado nome de fonte de dados. Como argumento do método, use o valor do Nome da fonte de dados (ou datasource.name
) que você especificou para a configuração do Pool de Conexões JDBC.
O código JSP de exemplo a seguir obtém uma instância da fonte de dados hsqldbds, executa uma consulta SQL simples e exibe o número de resultados retornados.
<%@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>
Se o método getDataSource gerar uma exceção porque a fonte de dados não foi encontrada, verifique se a configuração do serviço Pool de Conexões está correta. Verifique os nomes das propriedades, os valores e os tipos de dados.