Conteúdo


Configurando datasources no JBoss para DB2 9.7 LUW

Comments

Introdução:

Este artigo tem como finalidade mostrar como configurar e testar datasources no JBoss para acesso ao database DB2 LUW 9.7. As duas edições do JBoss neste artigo são : 7.1.1 Final e 4.0.5 GA. Ambas as edições são versões OPEN (COMMUNITY) do JBoss, e amplamente utilizadas como application server para aplicações Java. Este artigo destina-se a quem deseja usar o DB2 9.7 LUW como seu banco de dados e o JBoss como seu application server. O objetivo do artigo não e ensinar a instalação do DB2 ou JBoss, mas sim a configurar os datasources.

Pré-instalação do client DB2 e algumas considerações:

A instalação do software client DB2 é um requisito, pois pelo client pode ser feito o teste de conectividade para o database remoto, podendo ajudar a verificar se todos os parametros usados no datasource estão corretos ou não. Outro fator importante na instalação do client é que este já vem com os drivers JDBC necessários para a configuração dos datasources e bibliotecas adicionais. Para a criação do datasource, é necessário setar a variável de ambiente LD_LIBRARY_PATH para os diretórios "lib64" e "lib32". Neste tutorial, o usuário no qual instalei o JBoss é dono de uma instância DB2 9.7 LUW, e a variável de ambiente LD_LIBRARY_PATH foi modificada para incluir os diretórios citados
(LD_LIBRARY_PATH=/home/db2inst1/sqllib/lib64:/home/db2inst1/sqllib/lib32). O diretório citado como <JBOSS_HOME> e o diretório de instalação do JBoss. A variável de ambiente <JAVA_HOME> pode ser uma JDK de acordo com as especificações do JBoss 4.0.5 GA.

Configuração JBoss 7.1.1 Final:

Primeiro passo – Criando o Módulo

O Módulo (module) na estrutura do JBoss é um conjunto de classes. Iremos usar a estrutura de módulos no JBoss 7.1.1 Final para subir os arquivos do driver JDBC, e criar um link para que o driver utilize o módulo criado.

No diretório <JBOSS_HOME>/modules criar a seguinte estrutura de diretórios: <JBOSS_HOME>/modules/db2/jdbc/main

Dentro desta estrutura, copie os arquivos do driver do DB2: db2jcc4.jar e db2jcc_license_cu.jar

Para que o JBoss reconheça a estrutura do módulo, precisamos criar um arquivo XML como no exemplo a seguir:

 <?xml version="1.0" encoding="UTF-8"?>
     <module xmlns="urn:jboss:module:1.0" name="db2.jdbc">
         <resources>
                <resource-root path="db2jcc4.jar"/>
                <resource-root path="db2jcc_license_cu.jar"/>
         </resources>
        <dependencies>
                <module name="javax.api"/>
                <module name="javax.transaction.api"/>
        </dependencies>
     </module>

Com a criação do módulo, podemos agora criar uma ligação entre ele e a estrutura Driver, para posteriormente criar o datasource que o utilizará.

As dependências incluídas, “javax.api” e “javax.transaction.api”, são necessárias para suporte a transações distribuídas utilizando Java (XA).

Segundo Passo – Driver e Datasource

Para criar as duas próximas estruturas, precisamos editar o arquivo standalone.xml, que está localizado no seguinte diretório: <JBOSS_HOME>/standalone/configuration.

Neste arquivo iremos criar a estrutura do Driver, fazendo referência ao módulo que criamos.

Dentro do arquivo standalone.xml, procure pela tag xml <drivers>, adicione o driver e indique o módulo utilizado por ele.

No exemplo abaixo estou adicionando o driver DB2JDBCDriver:

     <drivers>
      <driver name="h2" module="com.h2database.h2">
        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
      </driver>
       <driver name="OracleJDBCDriver" module="oracle.jdbc"/>
      <driver name="DB2JDBCDriver" module="db2.jdbc"/>
    </drivers>

No campo MODULE preencher o nome do módulo criado.

Com esta modificação, já temos disponível o driver para o datasource. Abaixo da tag datasources, você poderá criar os datasources que achar necessário agora, utilizando o driver recentemente criado.

No exemplo abaixo, criarei dois datasources, um sem suporte a XA e outro com esse suporte. O driver XA suporta transações distribuídas.

Nos dois datasources teremos que preencher as informações de HOST, PORTA, nome do DATABASE, USUÁRIO e SENHA para conexão ao database.

No datasource sem suporte a XA o host, porta e nome estão contidos na propriedade URL.

No datasource com suporte a XA, cada uma delas está em uma propriedade separada.

Exemplo Datasource sem suporte a XA:

  <datasource jta="false" jndi-name="java:jboss/DB2DS" pool-name="DB2DS" enabled="true" 
use-ccm="false">
               <connection-url>jdbc:db2://localhost:50010/DBORA1</connection-url>
               <driver-class>com.ibm.db2.jcc.DB2Driver</driver-class>
               <driver>DB2JDBCDriver</driver>
               <security>
                  <user-name>db2inst1</user-name><password>db2admin</password>
               </security>
              <validation>
                  <validate-on-match>false</validate-on-match>
                  <background-validation>false</background-validation>
              </validation>
              <statement>
                 <share-prepared-statements>false</share-prepared-statements>
              </statement>
  </datasource>

Exemplo Datasource com suporte a XA:

 <xa-datasource jta="true" jndi-name="java:jboss/datasources/DB2XA" pool-
name="java:jboss/datasources/DB2XA" enabled="true" use-java-context="true" use-ccm="true">
              <xa-datasource-property name="User">db2inst1</xa-datasource-property>
  
              <xa-datasource-property name="Password">db2admin</xa-datasource-property>
              <xa-datasource-property name="ServerName">localhost</xa-datasource-property><xa-datasource-property name="PortNumber">50010</xa-datasource-property><xa-datasource-property name="DatabaseName">DBORA1</xa-datasource-property><xa-datasource-class>com.ibm.db2.jcc.DB2XADataSource</xa-datasource-class><driver>DB2JDBCDriver</driver>
              <xa-pool>
                  <prefill>true</prefill>
                  <is-same-rm-override>false</is-same-rm-override>
                  <interleaving>false</interleaving>
                  <pad-xid>false</pad-xid>
                  <wrap-xa-resource>false</wrap-xa-resource>
              </xa-pool>
              <validation>
                       <validate-on-match>false</validate-on-match>
                       <background-validation>false</background-validation>
              </validation>
              <statement>
                    <share-prepared-statements>false</share-prepared-statements>
              </statement>
          </xa-datasource>

Com isto temos os dois datasources criados. Agora podemos testar os dois datasources usando a console adminstrativa do JBoss 7.1.1 Final.

Testando os Datasources

Agora podemos validar os datasources pela console administrativa do JBoss 7.1.1 Final.

 
 
 

Visualizar imagem ampliada

Na figura acima podemos ver a console administrativa do JBoss.

Na parte direita acima clique em PROFILE. No menu do lado esquerdo clique em CONNECTOR, depois em DATASOURCES. Selecione o datasource que deseja testar, e na parte inferior, selecione a aba CONNECTION. No canto esquerdo podemos ver o botão TEST CONNECTION. Basta clicar no botão e ver se está tudo correto com o datasource criado.

 
 
 

Visualizar imagem ampliada

 
 
 

Visualizar imagem ampliada

Como podemos ver, o datasource conseguiu conectar com sucesso ao database DB2.

Para testar o XA DATASOURCE, faça o mesmo processo, porém na aba acima selecione o XA DATASOURCES, como na figura abaixo.

 
 
 

Visualizar imagem ampliada

 
 
 

Visualizar imagem ampliada

Para verificar as conexões no DB2 execute o comando db2 LIST APPLICATIONS na instância DB2. Como os datasources estão com Pool mínimo de conexões 0, foi criada uma única conexão para cada datasource, como demonstrado na figura abaixo.

 
 
 

Visualizar imagem ampliada

Configuração JBoss 4.0.5 GA:

Primeiro Passo - Configurações iniciais e deploy do arquivos de driver JDBC

Para iniciar o JBoss 4.0.5, algumas variáveis de ambiente serão necessárias (os diretórios utilizados são somente de exemplo):

JBOSS_HOME=/home/ftsouza/jboss-4.0.5.GA/jboss-4.0.5.GA
JAVA_HOME=/home/db2inst1/sqllib/java/jdk64

O JAVA_HOME deve apontar para uma JDK.

Como citado anteriormente, a instalação do DB2 client é necessária, e a variável de ambiente LD_LIBRARY_PATH precisa conter o valor dos diretórios “lib64” e “lib32”:

LD_LIBRARY_PATH=/home/db2inst1/sqllib/lib64:/home/db2inst1/sqllib/lib32

Faça a cópia dos arquivos de driver JDBC, db2jcc4.jar e db2jcc_license_cu.jar, para o seguinte diretório: JBOSS_HOME/server/default/lib.

Com isso, já temos os drivers de JDBC na biblioteca default do JBoss 4.0.5 GA, e podemos seguir para a criação dos datasources.

Segundo Passo – Criando datasource e configurações adicionais

No diretório JBOSS_HOME/docs/examples/jca temos exemplos de criação de datasources XA e não XA para DB2 e outros databases. Podemos iniciar a configuração dos datasources utilizando estes arquivos de exemplo. No caso do DB2 vamos usar os arquivos db2-ds.xml e db2-xa-ds.xml, sendo o primeiro exemplo sem suporte a XA e o segundo com suporte a XA. Faça a cópia destes arquivos para o diretório JBOSS_HOME/server/default/deploy, para fazer o deploy dos datasources. Após a cópia podemos editar os dois arquivos para configurar os nossos datasources.

O arquivo db2-ds.xml foi editado da seguinte forma para criar uma datasource sem suporte a XA:

<datasources>
  <local-tx-datasource>
   <jndi-name>DB2DS</jndi-name>
   <connection-url>jdbc:db2://localhost:50010/DBORA1</connection-url>
   <driver-class>com.ibm.db2.jcc.DB2Driver</driver-class>
   <user-name>db2inst1</user-name>
   <password>db2admin</password>
   <min-pool-size>5</min-pool-size>
     <!-- sql to call when connection is created
     <new-connection-sql>some arbitrary sql</new-connection-sql>
     -->
     <!-- sql to call on an existing pooled connection when it is obtained from pool 
     <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
     -->
     <check-valid-connection-sql>select * from dual</check-valid-connection-sql>
     <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
    <metadata>
      <type-mapping>DB2</type-mapping>
    </metadata>
    </local-tx-datasource>
  </datasources>

O arquivo db2-xa-ds.xml foi editado da seguinte forma para criar um datasource com suporte a XA:

 <datasources>
  <!--
   XADatasource for DB2 V8.1 (app driver)
   
   copy $db2_install_dir/java/db2java.zip into $jboss_install_dir/server/default/lib
   
  -->
  <xa-datasource>
   <jndi-name>DB2XADS</jndi-name>
   <xa-datasource-class>com.ibm.db2.jcc.DB2XADataSource</xa-datasource-class>
   <xa-datasource-property name="User">db2inst1</xa-datasource-property>
   <xa-datasource-property name="Password">db2admin</xa-datasource-property>
   <xa-datasource-property name="ServerName">localhost</xa-datasource-property>
   <xa-datasource-property name="PortNumber">50010</xa-datasource-property>
   <xa-datasource-property name="DatabaseName">DBORA1</xa-datasource-property>
   <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
   <metadata>
    <type-mapping>DB2</type-mapping>
   </metadata>
  </xa-datasource>
 </datasources>

Após o deploy dos datasources, ainda precisamos mudar algumas configurações e arquivos no JBoss 4.0.5 GA. Precisamos modificar o arquivo JBOSS_HOME/server/default/conf/standardjaws.xml. Adicione as seguinte linhas após o primeiro fechamento de tag xml </jaws>:

 <jaws> 
  <datasource>java:/DB2DS</datasource>
  <type-mapping>DB2</type-mapping>
 </jaws>

O arquivo JBOSS_HOME/server/default/conf/standardjbosscmp-jdbc.xml também precisa de modificações se for utilizar este datasource com EJB (Enterprise Java Beans). Neste mesmo arquivo podemos fazer as configurações de datatypes próprios para o source e demais consistências que podem ser feitas por EJB / CMP (Container-Managed Transactions). Fazer a inclusão da seguinte informação:

 <jbosscmp-jdbc>
  
  <defaults>
   <datasource>java:/DB2DS</datasource>
   <datasource-mapping>DB2</datasource-mapping>
  </defaults>

Observação: O arquivo standardjbosscmp-jdbc.xml somente pode ter uma tag <defaults>, portanto terá você terá que sobrepor os valores anteriores nesta tag para incluir seus novos valores.

Feitas as configurações, temos os datasources prontos para utilização e testes.

Testando os datasources

Diferentemente do JBoss 7.1.1 Final, não temos nenhuma console administrativa com testes de conectividade para datasources. Para os testes com JBoss 4.0.5 GA podemos fazer o deploy de uma simples aplicação em JSP (Java Server Pages) utilizando os datasources. O código JSP a seguir utiliza o datasource para o teste de conexão, e executa uma query para retornar o nome do database.

Código JSP utilizando o datasource sem suporte a XA:

 <%@page contentType="text/html"
 import="java.util.*,javax.naming.*,javax.sql.DataSource,java.sql.*"
 %>
 <%
 DataSource ds = null;
 Connection con = null; 
 PreparedStatement pr = null; 
 InitialContext ic; 
 try {
 ic = new InitialContext();
 ds = (DataSource)ic.lookup( "java:/DB2DS" );
 con = ds.getConnection(); 
 pr = con.prepareStatement("SELECT CURRENT SERVER AS DBNAME FROM DUAL");
 ResultSet rs = pr.executeQuery();
 while (rs.next()) {
 out.println("<br> " + "Conectado ao db2 --> " + rs.getString("DBNAME")); 
 }
 rs.close();
 pr.close();
 }catch(Exception e){
 out.println("Exception thrown " +e); 
 }finally{
 if(con != null){
 con.close();
 }      
 } %>

Código JSP utilizando o datasource com suporte a XA:

 <%@page contentType="text/html"
 import="java.util.*,javax.naming.*,javax.sql.DataSource,java.sql.*"
 %>
 <%
 DataSource ds = null;
 Connection con = null; 
 PreparedStatement pr = null; 
 InitialContext ic; 
 try {
 ic = new InitialContext();
 ds = (DataSource)ic.lookup( "java:/DB2XADS" );
 con = ds.getConnection(); 
 pr = con.prepareStatement("SELECT CURRENT SERVER AS DBNAME FROM DUAL");
 ResultSet rs = pr.executeQuery();
 while (rs.next()) {
 out.println("<br> " + "Conectado ao db2 XA --> " + rs.getString("DBNAME")); 
 }
 rs.close();
 pr.close();
 }catch(Exception e){
 out.println("Exception thrown " +e); 
 }finally{
 if(con != null){
 con.close();
 }      
 } %>

Crie um arquivo “.jsp” com um dos dois códigos acima e faça o deploy no JBOSS. Para fazer o deploy neste teste criei os diretórios JBOSS_HOME/server/default/deploy/jdbcclient.war, para teste de datasource sem suporte a XA, e JBOSS_HOME/server/default/deploy/jdbcclient2.war, para o teste com suporte a XA. Dentro destes diretórios criei arquivos chamados client.jsp, cada uma com o respectivo código.

Feito o deploy para acesse a página com as seguintes URLs: http://localhost:8080/jdbcclient/client.jsp e http://localhost:8080/jdbcclient2/client.jsp.

O resultado dos testes pode ser visto na tela com o nome do database sendo acessado. No caso do nosso teste, o nome é DBORA1.

 
 
 

Visualizar imagem ampliada

 
 
 

Visualizar imagem ampliada

 
 
 

Visualizar imagem ampliada

No caso do datasource DB2DS, o POOL mínimo configurado foi de 5 conexões, por isso podemos ver 5 conexões no DB2. No caso de DB2XADS, deixei o pool com mínimo de 0 conexões.

No console administrativo do JBOSS 4.0.5 GA temos informações sobre as conexões, como pode ser observado nas figuras abaixo.

 
 
 

Visualizar imagem ampliada

 
 
 

Visualizar imagem ampliada

Conclusão

Com este artigo queria demonstrar como podemos usar o DB2 com o JBoss application server, e incentivar quem utiliza hoje JBoss a utilizar o DB2 como o banco de dados relacional para sua aplicação.

Referências

http://www.ibm.com/developerworks/data/library/techarticle/dm-0504vohra/

http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/index.html

http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/The_CMP_Engine-The_jbosscmp_jdbc_Structure.html

http://www.jboss.org/jbossas/docs/

https://docs.jboss.org/author/display/AS71/Documentation


Recursos para download


Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Information Management
ArticleID=826624
ArticleTitle=Configurando datasources no JBoss para DB2 9.7 LUW
publish-date=07232012