Conectando a Bancos de Dados SQL

Última atualização em 2023-12-07

Acesse um banco de dados SQL externo no para que seus aplicativos de CQ possam interagir com os dados:

  1. Crie ou obtenha um pacote OSGi que exporte o pacote de driver JDBC.
  2. Configurar um provedor de pool de fonte de dados JDBC.
  3. Obter um objeto de fonte de dados e criar a conexão em seu código.

Agrupando o driver do banco de dados JDBC

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.

POM que empacota 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>

Os links a seguir abrem as páginas de download de alguns produtos de banco de dados populares:

Configurando o serviço de pool de conexão JDBC

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 usem 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 que 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.

chlimage_1-7

Conexão com o banco de dados

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.

JSP que executa uma pesquisa de banco de dados

<%@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>
OBSERVAÇÃO

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.

Nesta página