Pergunta

Meu aplicativo CQ5 precisa se conectar a um RDBMS externo. Como configuro e conecto a um DataSource JDBC?

Resposta, Resolução

Como exemplo, criaremos um DataSource JDBC para nos conectarmos a um H2 mecanismo de banco de dados

Instale o driver JDBC para o seu banco de dados.

  • Se seu fornecedor de banco de dados fornecer um jar com o driver JDBC como um pacote OSGi, você poderá implementá-lo diretamente no Console do Felix.
  • Se o pacote OSGi com seu driver não estiver disponível, você poderá adicionar o jar ao caminho de classe compartilhado do servidor de aplicativos, por exemplo, crx-quickstart/server/lib/container no CQSE, e criar um pacote de extensão.
    • Crie um arquivo de manifesto. Para este exemplo, vamos chamá-lo de h2ext.mf. Consulte abaixo a lista de códigos.
      Observe que a linha em branco no final de um arquivo de manifesto jar é necessária.
    • Crie um arquivo jar com o manifesto acima usando o seguinte comando.
      jar -cfm org.h2.jdbc.driver.extension-1.1.119.jar h2ext.mf 
    • Instale o org.h2.jdbc.driver.extension-1.1.119.jar utilizando o Console do Felix. Isso deve adicionar o pacote org.h2 à lista de exportação do Pacote do Sistema.
    • Consulte a seção 3.15, Pacotes de Extensões, do Núcleo da Plataforma de Serviços OSGi para obter mais informações sobre Pacotes de Extensões.
  • Outra opção é incorporar o driver jdbc em outro pacote OSGi. Se você estiver usando o CRXDE para criar um pacote OSGi, poderá colocar o jar do driver no diretório lib do pacote. O CRXDE irá incorporá-lo automaticamente.
  • Outra opção é adicionar o jar ao caminho de classe compartilhado de seu servidor de aplicativos e usar a propriedade org.osgi.framework.bootdelegation em sling.propeties para carregar a classe do driver. Clique aqui para mais informações. Por exemplo, se você estiver usando H2 banco de dados, copie h2-1.1.119.jar para o crx-quickstart/server/lib/container. Em seguida, adicione a linha "sling.bootdelegation.class.org.h2.Driver=org.h2" ao 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 o pool de conexão JDBC

Navegue para o Gerenciador de Configuração no console do Felix (http://localhost:4502/system/console/configMgr). Use o factory de configuração do Pool de Conexões JDBC para criar um novo conjunto de conexões. Por exemplo, pode ter as seguintes configurações.

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

Obtenha uma instância da fonte de dados.

Uma vez configurada, a instância do DataSource é adquirida chamando o método getDataSource(String datasourceName) do serviço DataSourcePool (com.day.commons.datasource.poolservice.DataSourcePool) e lhe transmitindo o nome da origem de dados.

Exemplo de componente do OSGi

Neste exemplo, estamos criando um serviço OSGi simples que pode ser usado para obter uma instância de um DataSource. Este exemplo não é realista, uma vez que basicamente reinventa a mesma API como com.day.commons.datasource.poolservice.DataSourcePool sem adicionar nenhuma funcionalidade. Mas isso mostra como o DataSourcePool pode ser usado em seu próprio código.

Vamos primeiro criar uma interface para o nosso serviço.

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

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

Agora a implementação. Como você pode ver, além de ocultar o DataSourceNotFoundException, ele não adiciona nenhum 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;
    }
}

Essa classe está usando a especificação dos Serviços Declarativos OSGi para obter uma instância do serviço DataSourcePool e, em seguida, chama seu getDataSource(dataSourceName) para obter o DataSource. Plugin SCR Maven está usando as anotações scr-java para gerar os descritores XML para os Serviços Declarativos OSGi. O arquivo zip anexado contém o exemplo POM.

Você pode baixar um exemplo completo aqui: datasourceutil.zip. Inclui um POM maven para construí-lo. Para construir este projeto usando o POM fornecido, consulte Como usar o CQ5 como repositório maven.

Exemplo de JSP

Este é um pacote CRX que contém um exemplo JSP - datasource-example-jsp.zip. É um componente CQ que pode ser adicionado a qualquer página com um sistema de parágrafo. Pode ser usado para testar sua conexão com o DataSource.

5.3 Observação

Adicionado é um pacote de amostra para construir com CRXDE / CRXDE Lite que contém o driver de instalação oracle oracle_example_driver.zip, dê uma olhada em /apps/oracle.In o Activator.java explicitamente carrega a classe de driver (pode não ser necessário em versões futuras). Certifique-se de ter instalado o mais recente day.commons.datasource.jdbcpool (1.0.8) antes de usá-lo.

Aplica-se a

CQ5.2.1, CQ5.3

Download

Esta obra está licenciada sob uma licença não adaptada da Creative Commons Attribution-Noncommercial-Share Alike 3.0  As publicações do Twitter™ e do Facebook não são cobertas pelos termos do Creative Commons.

Avisos legais   |   Política de privacidade online