Percebemos que esta é uma dúvida comum para os desenvolvedores que usam o Demoiselle e que vamos esclarecer um pouco agora.
Como já é bem conhecido, a partir da versão 2 do Demoiselle o padrão para interfaceamento com base de dados é a especificação JPA2. O desenvolvedor quando faz uso do Demoiselle 2 percebe que a recomendação e padrão para a configuração de conexão com banco de dados no arquivo persistence.xml (JPA), têm sido através do uso do recurso do Servidor de aplicações (no caso o JBoss) conhecido como DataSource. Um “DataSource” é um mecanismo com o qual o servidor de aplicações, gerencia o acesso a uma conexão com o banco de dados. Se a aplicação utilizará um servidor de aplicações como o JBoss, nada é mais prático e seguro que usar o recurso que já está disponível e otimizado para esse ambiente. Além disso alguns outros recursos como por exemplo um pool de conexões, são bem mais simples de se configurar. Além disso, em organizações departamentalizadas, onde os ambientes de desenvolvimento, homologação e produção são separados, as configurações de conexão de bancos de dados ficam a cargo de cada um dos setores, o que é positivo para questões como segurança por exemplo.
Mas enfim, o objetivo do post não é justificar ou embasar o uso do recurso, e sim mostra como isso pode ser feito.
Antes de mais nada, partimos do pressuposto que estamos trabalhando como uma aplicação criada pelo arquétipo demoiselle-jsf-jpa (http://demoiselle.sourceforge.net/repository/archetype-catalog.xml). Outra premissa é que a versão do JBoss-AS seja no máximo a 6.1(http://community.jboss.org/wiki/AS610FinalReleaseNotes) pois a partir da versão 7.0 a configuração é um pouco diferente e será tópico de outro post.
Após criada a aplicação na IDE Eclipse (veja como fazer isso em http://demoiselle.sourceforge.net/docs/quickstart/2.0.4/html/ ), devemos localizar o arquivo src/main/resources/META-INF/persistence.xml.
Listando o arquivo persistence.xml, podemos verificar os trechos:
<!– If you are using jboss6 with non JTA transaction then use this persistence-unit –>
<!–
–>
<persistence-unit name=“bookmark-ds” transaction-type=“RESOURCE_LOCAL”>
<non-jta-data-source>java:/DefaultDS</non-jta-data-source>
<class>br.org.frameworkdemoiselle.bookmark.domain.Bookmark</class>
<properties>
<property name=“hibernate.show_sql” value=“true” />
<property name=“hibernate.format_sql” value=“false” />
<property name=“hibernate.hbm2ddl.auto” value=“create-drop” />
<property name=“hibernate.transaction.manager_lookup_class” value=“org.hibernate.transaction.JBossTransactionManagerLookup” />
</properties>
</persistence-unit>
<persistence-unit name=“bookmark-ds” transaction-type=“JTA”>
<jta-data-source>java:/DefaultDS</jta-data-source>
<class>br.org.frameworkdemoiselle.bookmark.domain.Bookmark</class>
<properties>
<property name=“hibernate.show_sql” value=“true” />
<property name=“hibernate.format_sql” value=“false” />
<property name=“hibernate.hbm2ddl.auto” value=“update” />
<property name=“hibernate.transaction.manager_lookup_class” value=“org.hibernate.transaction.JBossTransactionManagerLookup” />
</properties>
</persistence-unit>
As linhas que nos interessam agora são:
<non-jta-data-source>java:/DefaultDS</non-jta-data-source>
e
<jta-data-source>java:/DefaultDS</jta-data-source>
Neste post não comentaremos sobre a JTA (http://www.oracle.com/technetwork/java/javaee/jta/index.html), mas resumindo a instrução das tag em poucas palavras: non-jta-data-source significa que as transações NÃO serão gerenciadas pelo servidor de aplicações, mas as configurações de conexão serão tratadas (ex: usuário, senha, endereço do servidor de banco de dados) conforme o DataSource. Já a jta-data-source todo o gerenciamento será feito pelo servidor de aplicações. Note que há uma instrução: java:/DefaultDS, isso tem relação com o que está configurado diretamente no servidor de aplicações. Obviamente só podemos definir um tipo de conexão JTA no arquivo de configuração persistence.xml. Para o nosso exemplo a escolha será a jta-data-source.
Dentro da aplicação, isso é tudo que precisamos saber. Sobre as outras tags do persistence.xml você encontrará informações na especificação JPA ou na documentação dos provedores de implementação (ex: Hibernate, EclipseLink). No caso do nosso exemplo, estão sendo utilizadas tags para o Hibernate que é a implementação padrão que já vem com o servidor JBoss.
Agora podemos explorar a configuração no servidor.
Neste exemplo, estamos usando o JBoss 6, mas as configurações e locais são os mesmos para as versões anteriores. Encontre o diretório de Deploy do servidor, para quem utiliza os pacotes do projeto Infra será por exemplo: /opt/demoiselle/server/jboss-6.0/server/default/deploy/ ou para quem está usando cluster: /opt/demoiselle/server/jboss-6.0/server/all/deploy
Neste diretório encontraremos o arquivo hsqldb-ds.xml.
O conteúdo do arquivo descreve uma configuração para o banco de dados Hsqldb (http://hsqldb.org/), que contém a localização do banco, o usuário, senha de acesso e outras informações importantes para a conexão. A informação que nos interessa é a tag:
<jndi-name>DefaultDS</jndi-name>
Essa tag é que está relacionada à instrução que encontramos na aplicação que foi criada anteriormente:
<jta-data-source>java:/DefaultDS</jta-data-source>
Essa relação é estabelecida por Java Naming and Directory Interface (JNDI http://www.oracle.com/technetwork/java/jndi/index.html ), portanto é esse “nome” (no exemplo: DefaultDS) que relaciona a configuração da aplicação à do servidor de aplicações. Quando o servidor de aplicações encontra esse tipo de arquivo faz automaticamente essa conexão. Especificamente no JBoss, podemos ver a instrução na console quando o servidor é iniciado:
INFO [ConnectionFactoryBindingService] Bound ConnectionManager ‘jboss.jca:service=DataSourceBinding,name=DefaultDS’ to JNDI name ‘java:DefaultDS’
Assim, a aplicação gerada pelo arquétipo Demoiselle, faz somente a relação com uma configuração que já é provida por padrão pelo servidor JBoss. Não sendo portanto necessário nenhuma intervenção do desenvolvedor para utilizar essa conexão na aplicação.
Com isso, desvendamos a forma como a aplicação de exemplo do arquétipo Demoiselle utiliza-se do recurso JTA pré-definido no servidor JBoss.
Na prática, não será tão comum utilizar essa configuração padrão, pois é mais habitual que o gerenciador de bando de dados esteja em outro equipamento ou em uma arquitetura mais complexa como um cluster por exemplo. E também há vários gerenciadores de bancos de dados disponíveis no mercado.
Como última dica deste texto, vamos exemplificar a configuração da aplicação para um banco de dados PostgreSQL.
Vamos considerar que o servidor de banco de dados já exista, assim como um usuário de testes.
Para nos ajudar, o JBoss-AS nos oferece um conjunto de exemplos pré-configurados para uma lista de servidores de banco de dados conhecidos no mercado. Estes arquivos podem ser encontrados no diretório de documentos da instalação (/docs/jca). No nosso exemplo usaremos o: /opt/demoiselle/server/jboss-6.0/docs/examples/jca/postgres-ds.xml. Listado abaixo:
<?xml version=“1.0″ encoding=“UTF-8″?>
<!– ===================================================================== –>
<!– –>
<!– JBoss Server Configuration –>
<!– –>
<!– ===================================================================== –>
<!– See http://www.jboss.org/community/wiki/Multiple1PC for information about local-tx-datasource –>
<!– $Id: postgres-ds.xml 97536 2009-12-08 14:05:07Z jesper.pedersen $ –>
<!– ==================================================================== –>
<!– Datasource config for Postgres –>
<!– ==================================================================== –>
<datasources>
<local-tx-datasource>
<jndi-name>PostgresDS</jndi-name>
<connection-url>jdbc:postgresql://[servername]:[port]/[database name]</connection-url>
<driver-class>org.postgresql.Driver</driver-class>
<user-name>x</user-name>
<password>y</password>
<!– sql to call when connection is created. Can be anything, select 1 is valid for PostgreSQL
<new-connection-sql>select 1</new-connection-sql>
–>
<!– sql to call on an existing pooled connection when it is obtained from pool. Can be anything, select 1 is valid for PostgreSQL
<check-valid-connection-sql>select 1</check-valid-connection-sql>
–>
<!– corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) –>
<metadata>
<type-mapping>PostgreSQL 7.2</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
Aproveitando esse arquivo base, podemos definir e alterar o arquivo para o seguinte exemplo:
<?xml version=“1.0″ encoding=“UTF-8″?>
<datasources>
<local-tx-datasource>
<jndi-name>bookmarkPostgresqlDS</jndi-name>
<connection-url>jdbc:postgresql://10.0.0.1:5432/bookmark</connection-url>
<driver-class>org.postgresql.Driver</driver-class>
<user-name>bookmark</user-name>
<password>bookmark</password>
<min-pool-size>5</min-pool-size>
<max-pool-size>30</max-pool-size>
<idle-timeout-minutes>0</idle-timeout-minutes>
<track-statements/>
<prepared-statement-cache-size>32</prepared-statement-cache-size>
<new-connection-sql>select 1</new-connection-sql>
<check-valid-connection-sql>select 1</check-valid-connection-sql>
<metadata>
<type-mapping>PostgreSQL 8.0</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
Esse arquivo deverá ser armazenado no mesmo diretório de Deploy onde localizamos o arquivo hsqldb-ds.xml.
Em seguinda devemos alterar a configuração no arquivo para se referenciar a nova configuração persistence.xml para:
<jta-data-source>java:/BookmarkPostgresqlDS</jta-data-source>
Outra coisa ser conferida é o arquivo beans.xml (em /src/main/resources/),
É provável que esteja assim:
<alternatives>
<class>br.gov.frameworkdemoiselle.transaction.JPATransaction</class>
<!–
<class>br.gov.frameworkdemoiselle.transaction.JTATransaction</class>
–>
</alternatives>
Certifique-se que a classe ativa seja a JTATransaction, ficando assim:
<alternatives>
<class>br.gov.frameworkdemoiselle.transaction.JTATransaction</class>
</alternatives>
A última providência, é a lib do driver do banco de dados que estamos utilizando, neste link estão os drivers do PostgreSQL:
http://jdbc.postgresql.org/download.html
Para que a estratégia JTA funcione corretamente, o driver deverá ser incluído diretamente no servidor, assim como é com o datasource, no seguinte diretório:
/opt/demoiselle/server/jboss-6.1/lib/
Com estas alterações a aplicação passará a utilizar o PostgreSQL ao invés do Hsqldb.
Poderíamos utilizar o mesmo nome JNDI: DefaultDS, no lugar de BookmarkPostgresqlDS, e dessa forma não precisar alterar a configuração na aplicação. Mas neste caso teríamos que excluir o arquivo hsqldb-ds.xml, ou alterar a tag <jndi-name> para outro nome. Pois não é possível ter o mesmo JNDI-Name.
Obviamente que cada Gerenciador de Banco de Dados pode ter alguma particularidade com relação à configuração do DataSource, mas geralmente é tarefa do Administrador de Banco de dados ou a área de produção. E mesmo que tudo esteja por conta do desenvolvedor, ainda assim é mais simples do que manter toda a configuração na aplicação.
Autor: Emerson Sachio Saito