sábado, 21 de setembro de 2013

Configurando fontes de dados com o JBoss (I)

Este post faz parte de uma série sobre Spring, JPA e JSF. Caso algum assunto abordado aqui não esteja claro, consulte este link: Spring + JPA.

Pra começo de conversa, por que usar o JBoss?

O JBoss é um robusto servidor de aplicações, baseado na mesma arquitetura do Apache TomCat, e suporta muito bem o gerenciamento de transações. Já o TomCat não pode ser chamado de servidor de aplicações - seria apenas um "container web". Um ambiente ideal seria desenvolver usando o TomCat e distribuir usando o JBoss. O TomCat não deve ser utilizado em produção, mas pode perfeitamente ser utilizado durante o desenvolvimento, já que é bem mais fácil de configurar e bem mais rápido para efetuar os testes. Mas as coisas não acontecem da mesma maneira no TomCat e no Jboss... Como o TomCat precisa de bibliotecas de terceiros para suportar transações, já tive bastante dor de cabeça para ajustar um sistema inteiro depois de simplesmente mudar de TomCat para Jboss, e depois dessas experiências, agora faço os testes no JBoss, também. Mesmo que seja mais demorado, tenho a garantia de distribuir imediatamente meu projeto assim que os testes terminam.

Depois de baixar o JBoss (eu uso nestes exemplos a versão 6.1.0.Final), é importante editar o arquivo /jboss-6.1.0.Final/bin/run.conf e fazer a modificação a seguir:

#
# Specify options to pass to the Java VM.
#
if [ "x$JAVA_OPTS" = "x" ]; then
   JAVA_OPTS="-Xms2G -Xmx6G -XX:MaxPermSize=2G -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=36000 -Dsun.rmi.dgc.server.gcInterval=36000"
fi

Os valores que aparecem na frente dos Xms, Xmx e MaxPermSize devem ser os mais altos que a memória do seu servidor comportar (faça quantos testes forem necessários, vale a pena). Quanto mais altos estes valores, menos o servidor irá travar e menos problemas de "Permgen" surgirão. E isto não é uma característica do JBoss, não. Ao implantar/desimplantar um projeto várias vezes, seja no TomCat, no Glassfish, etc., sempre chega um momento em que o servidor não consegue gerenciar mais a memória que lhe foi reservada, e aí, só reiniciando.

No caso de usar o NetBeans, como eu, pode ser necessário fazer a alteração nas propriedades do servidor, como mostrado abaixo:

Depois do JBoss instalado e configurado, voltamos ao projeto. É necessário criar um arquivo que chamaremos de jboss-web.xml, na pasta WEB-INF:


O conteúdo deste arquivo é bastante simples:

<?xml version="1.0" encoding="UTF-8"?>
<!-- jboss-web.xml -->
<jboss-web>
  <context-root>/livraria</context-root>
  <resource-ref>
    <res-ref-name>jdbc/fonteDeDados</res-ref-name>
    <jndi-name>java:/fonteDeDados</jndi-name>
  </resource-ref>
</jboss-web>

O contexto, mostrado na linha 4, deve coincidir com o contexto do projeto. No NetBeans, para definir o contexto e o URL relativo, basta acessar as propriedades do projeto e a opção executar:

Percebemos, nas linhas 6 e 7, o famoso identificador "fonteDeDados" que apareceu nos arquivos de configuração do Spring. Esta fonte de dados deve ser referenciada nos arquivos de configuração do servidor JBoss (no TomCat não é necessário...), mais especificamente, em um arquivo da pasta /jboss-6.1.0.Final/server/default/deploy com sufixo "-ds". Uma boa prática é eliminar todos os arquivos desta pasta que tenham o sufixo "-ds" e centralizar em um único arquivo, por exemplo, "config-ds.xml", mostrado a seguir:

<datasources>  
  
   <local-tx-datasource>       
      <jndi-name>fonteDeDados</jndi-name>    
      <connection-url>jdbc:postgresql://meuServidor:5432/meuBancoDeDados</connection-url>   
      <driver-class>org.postgresql.Driver</driver-class>  
      <user-name>postgres</user-name>  
      <password>minhaSenha</password>  
      <min-pool-size>5</min-pool-size>  
      <max-pool-size>300</max-pool-size>  
      <idle-timeout-minutes>0</idle-timeout-minutes>    
   </local-tx-datasource>  
  
   <local-tx-datasource>          
      <jndi-name>outraFonteDeDados</jndi-name>    
      <connection-url>jdbc:postgresql://meuOutroServidor:5432/meuOutroBancoDeDados</connection-url>   
      <driver-class>org.postgresql.Driver</driver-class>  
      <user-name>postgres</user-name>  
      <password>minhaSenha</password>  
      <min-pool-size>5</min-pool-size>  
      <max-pool-size>300</max-pool-size>  
      <idle-timeout-minutes>0</idle-timeout-minutes>    
   </local-tx-datasource>  
  
</datasources> 

Podemos verificar que o arquivo é formado por uma coleção de "local-tx-datasource", e que o primeiro deles está associado com o famigerado identificador "fonteDeDados" (linha 4). As linhas 5, 7, e 8 mostram a configuração da conexão ao banco de dados, que no exemplo é PostgreSQL. Como já enfrentei alguns problemas relativos ao número máximo de conexões, deixo sempre um número alto em max-pool-size (linha 10). Lembrando que o servidor de aplicações (JBoss) e o servidor de banco de dados devem ser máquinas com boa quantidade de memória.

Percebemos que o segundo datasource pode se conectar a outro banco de dados totalmente diferente, e nem precisa ser a mesma tecnologia - pode ser MySQL, por exemplo.

Aqui termina a configuração do JBoss. No próximo post, a criação da unidade de persistência.

Nenhum comentário:

Postar um comentário