Wednesday, March 27, 2013

Configurar o DataSource do MySQL no JBoss AS 7

Nesse post descrevo os passos para realizar a configuração do DataSource do MySQL no JBoss Application Server 7.

Sobre o JBoss AS

O JBoss AS 7 é a versão mais recente do container Java EE mantindo pela Red Hat, trata-se da versão open source do projeto. A Red Hat também disponibiliza  o JBoss EAP 6, como um produto (suporte e treinamento). Ambas as versões 6 e 7, na teoria, contam com a mesma base de código e features.

O JBoss sofreu uma grande reestruturação, se compararmos com versões anteriores (4 e 5). Um novo mecanismo para definir e utilizar módulos, melhorias consideráveis na performance e na administração do servidor são algumas características do JBoss AS 7. As mudanças afetam a forma de administrar o servidor, um exemplo disso é a própria configuração do DataSource.

O JBoss AS pode ser operado em dois modos: managed domain aonde múltiplas instâncias ativas são orquestradas (controladas) por um ponto (host) central; a outra é a standalone aonde uma única instância do servidor é utilizada (parecido com as versões antigas). Nesse post eu utilizo o JBoss no modo standalone.

Instalar o driver do MySQL

Depois de baixar o driver JDBC do MySQL, é necessário instalar o driver como um módulo do JBoss. No diretório do JBoss, na pasta modules crie a estrutura de sub-pastas  \com\mysql\main, e copie o jar do driver dentro dessa pasta.


Nessa pasta, crie o arquivo module.xml, com o conteúdo a seguir:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.mysql">
  <resources>
    <resource-root path="mysql-connector-java-5.1.24-bin.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

Note a definição do nome do módulo com.mysql, na tag module de acordo com a estrutura de diretórios criada. A pasta main não é considerada, ela indica ao JBoss que essa é a versão principal do módulo. O JBoss permite a configuração de diferentes versões do mesmo módulo! Na tag resource-root indicamos o jar do MySQL contido no diretório main, que é justamente quem implementa o módulo. Outro detalhe são as dependências do módulo, definidas na tag dependencies.


Definir o DataSource

Uma vez que o módulo foi instalado, a próxima etapa é configurar o DataSource. Acesse o arquivo jboss7.../standalone/configuration/standalone.xml e adicione o conteúdo da tag datasource e driver, como a seguir:

<?xml version='1.0' encoding='UTF-8'?>
<server xmlns="urn:jboss:domain:1.2">
  ...
  <subsystem xmlns="urn:jboss:domain:datasources:1.0">
    <datasources>
      ...
      <datasource jndi-name="java:jboss/datasources/MysqlDS" 
        pool-name="MySqlDS" enabled="true" use-java-context="true">
        <!-- url jdbc -->
        <connection-url>jdbc:mysql://localhost:3306/db</connection-url>
        <!-- identificador do driver -->
        <driver>com.mysql</driver>

        <transaction-isolation>
          TRANSACTION_READ_COMMITTED
        </transaction-isolation>
        <pool>
          <min-pool-size>10</min-pool-size>
          <max-pool-size>100</max-pool-size>
          <prefill>true</prefill>
        </pool>

        <security>
          <user-name>root</user-name> <!-- usuario mysql -->
          <password>root</password> <!-- senha -->
        </security>
      </datasource>

      <drivers>
        ...
        <!-- definicao do driver -->
        <driver name="com.mysql" module="com.mysql">
          <xa-datasource-class>com.mysql.jdbc.Driver</xa-datasource-class>
        </driver>
      </drivers>
    </datasources>
  </subsystem>
  ...
</server>

Importante: Não remova nenhum conteúdo desse arquivo. Provalvemente já existe a configuração do driver e do datasource para o Hypersonic, um exemplo do JBoss. Mantenha essas configurações.

A tag driver indica que o módulo que nós acabamos de instalar, deve ser utilizado como um driver JDBC. Nela, indicamos qual é o nome do driver. Na outra tag driver, que fica dentro da definição do datasource, colocamos o nome do driver deve ser utilizado. O restante das tags indicam as informações de conexão com o MySQL e informações para criação do datasource (pool e transação).

Coloque o JBoss AS no ar, execute o arquivo jboss...\bin\standalone.sh (Windows standalone.bat). Verifique as informações do DataSource no log:

yaw@m21:/opt/jboss-as-7.1.1.Final/bin$./standalone.sh
=================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /opt/jboss-as-7.1.1.Final

  JAVA: /usr/lib/jvm/java-7-oracle/bin/java

  JAVA_OPTS:  -server -XX:+TieredCompilation -Xms64m -Xmx512m ...
=================================================================
00:30:55,948 INFO  [org.jboss.modules] JBoss Modules version 1.1.1.GA
00:30:56,105 INFO  [org.jboss.msc] JBoss MSC version 1.0.2.GA
00:30:56,149 INFO  [org.jboss.as] JBoss AS 7.1.1.Final "Brontes" starting
...

00:30:57,184 INFO  [org.jboss.as.connector.subsystems.datasources]
(ServerService Thread Pool -- 27) JBAS010404: Deploying non-JDBC-compliant 
driver class com.mysql.jdbc.Driver (version 5.1)

...

00:30:57,667 INFO  [org.jboss.as.connector.subsystems.datasources] 
(MSC service thread 1-4) JBAS010400: 
Bound data source [java:jboss/datasources/MysqlDS]

...

Agora você pode desenvolver aplicações Java EE com JBoss e MySQL, através desse DataSource. Veja como seria o persistence.xml (JPA) para utilizar esse datasource:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="appUnit">
    <!-- jndi-name -->
    <jta-data-source>java:jboss/datasources/MysqlDS</jta-data-source>
    <properties>
      <property name="hibernate.dialect" 
        value="org.hibernate.dialect.MySQLDialect"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
      <property name="hibernate.connection.charSet" value="UTF-8"/>
    </properties>
  </persistence-unit>
</persistence>


http://twitter.com/edermag
http://www.yaw.com.br


9 comments:

Alexandre said...

Muito bom cara! Me ajudou demais. Obrigado!

Alexandre said...
This comment has been removed by the author.
kipple said...

Eu não entendi o fato de no Glassfish ser possível subir a depedência do MySQL pelo Maven e no JBoss ter que criar toda essa parafernalha de modulos, é isso mesmo?

Carlos Marian said...

Concordo com o kipple, não tem uma forma de configurar direto na aplicação?

Unknown said...

Os conectores versão 5.1.30+ precisam declarar driver-class> no standalone.xml

driver name="mysql" module="com.mysql">
xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
driver-class>com.mysql.jdbc.Driver /driver-class >
</driver

Unknown said...

Como eu poderia configurar um datasource para Oracle 11g?
apenas alterando:

.jar para ojdbc6.jar
url para jdbc:oracle:thin:@ip:porta:service-name
driver para oracle.jdbc.driver.OracleDriver??

realizei estes ajustes, mas não funcionou, ao startar o jboss, a seguinte mensagem é emitida no console:

C:\app\server\jboss-as-7.1.1.Final\bin>standalone.bat
Calling "C:\app\server\jboss-as-7.1.1.Final\bin\standalone.conf.bat"
===============================================================================

JBoss Bootstrap Environment

JBOSS_HOME: C:\app\server\jboss-as-7.1.1.Final

JAVA: C:\Program Files\Java\jdk1.7.0_75\bin\java

JAVA_OPTS: -XX:+TieredCompilation -Dprogram.name=standalone.bat -Xms64M -Xmx512M -XX:MaxPermSize=256M -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Djboss.mod
oss.server.default.config=standalone.xml

===============================================================================

...
09:53:20,036 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-8) JBAS010400: Bound data source [java:jboss/datasources/ExampleDS]
09:53:20,036 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-7) JBAS010400: Bound data source [java:jboss/datasources/MysqlDS]
09:53:20,240 INFO [org.jboss.ws.common.management.AbstractServerConfig] (MSC service thread 1-4) JBoss Web Services - Stack CXF Server 4.0.2.GA
09:53:20,349 INFO [org.jboss.as.server.deployment.scanner] (MSC service thread 1-2) JBAS015012: Started FileSystemDeploymentService for directory C:\app\server\jboss-as-7.1.1.Final\standalone\deployments
09:53:20,365 INFO [org.jboss.as.remoting] (MSC service thread 1-7) JBAS017100: Listening on /127.0.0.1:4447
09:53:20,365 INFO [org.jboss.as.remoting] (MSC service thread 1-5) JBAS017100: Listening on /127.0.0.1:9999
09:53:20,661 INFO [org.jboss.as.controller] (Controller Boot Thread) JBAS014774: Service status report
JBAS014775: New missing/unsatisfied dependencies:
service jboss.jdbc-driver.oracle_jdbc_driver_OracleDriver (missing) dependents: [service jboss.data-source.java:jboss/datasources/OracleDS]

09:53:20,818 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:9990
09:53:20,818 ERROR [org.jboss.as] (Controller Boot Thread) JBAS015875: JBoss AS 7.1.1.Final "Brontes" started (with errors) in 3620ms - Started 139 of 218 services (2 services failed or missing dependencies, 74 services are passive or on-demand)

Unknown said...

Funcionou, é necessário também incluir a entrada do datasource e driver no arquivo standalone.xml.

Fabrício Dias said...

Pro pessoal que acha isso complicado, em um ambiente corporativo se atualiza aplicações o tempo todo, nos ambientes de desenvolvimento, de teste, de homologação e de produção. Cada uma apontando pra um banco específico (concordam que não se deve testar nos dados do ambiente de produção?). Deixando cada JBoss configurado pra um banco, você não precisa mexer no código fonte a cada mudança de ambiente, só pra mudar o banco. Isso evita inconsistências e riscos da aplicação de desenvolvimento escrever nos dados de produção ou de testes por exemplo, no caso de um descuido. Eu uso personagens de videogame pra fazer testes. Imagine alguém pesquisando usuários que realizaram uma operação, e encontrarem o Pacman na lista?

||< Fabiano Carloto >|| said...

tem como fazer essa configuração fora do standalone.xml? Trabalho em uma empresa e tenho um projeto que precisa conetar um um banco oracle só que o suporte do nosso servidor Jboss não quer configurar direto no standalone e falam que tem como fazer esse tipo de conexão direto pela aplicação ou colocando na pasta de deploy. Tem como fazer isso? Alguém tem algum exemplo que funcione?