Configurando datasources no JBoss para DB2 9.7 LUW

Aprenda como configurar, e testar, datasources para o database DB2 9.7 LUW no application server JBoss. As duas edições de JBoss utilizadas neste tutorial são: 7.1.1 Final e 4.0.5 GA, ambas versões OPEN (Community).

Fernando Henrique Telles de Souza, IMTE Consultant - DB2 Migration Specialist, IBM

Fernando Henrique Telles de SouzaDBA Oracle e Developer PLSQL na IBM em projetos para clientes como Embarq (Sprint) e TAM. Hoje atuando como consultor em migrações Oracle para DB2 no time IMTE Brasil. Ver perfil na Comunidade developerWorks



23/Jul/2012

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:

Clique aqui para ver lista de códigos

 <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

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


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