JBOSS AS 7. Auto recconect não funciona

7 respostas
vanegomesl

O problema é o seguinte. No meu sistema, quando acontecer de a aplicação perder conexão com o Banco De Dados, eu gostaria que o JBOSS desse um auto-recconect e buscasse automaticamente pela reconexão com o Banco de Dados. Já tentei algumas soluções como a que está destacada abaixo mas nenhuma deu certo.

<autoReconnect>
	true
</autoReconnect>

A seguir o código do standalone.xml

<?xml version='1.0' encoding='UTF-8'?>

<server name="AUTO_HOS2" xmlns="urn:jboss:domain:1.0">
    <extensions>
        <extension module="org.jboss.as.clustering.infinispan"/>
        <extension module="org.jboss.as.connector"/>
        <extension module="org.jboss.as.deployment-scanner"/>
        <extension module="org.jboss.as.ee"/>
        <extension module="org.jboss.as.ejb3"/>
        <extension module="org.jboss.as.jaxrs"/>
        <extension module="org.jboss.as.jmx"/>
        <extension module="org.jboss.as.jpa"/>
        <extension module="org.jboss.as.logging"/>
        <extension module="org.jboss.as.naming"/>
        <extension module="org.jboss.as.osgi"/>
        <extension module="org.jboss.as.remoting"/>
        <extension module="org.jboss.as.sar"/>
        <extension module="org.jboss.as.security"/>
        <extension module="org.jboss.as.threads"/>
        <extension module="org.jboss.as.transactions"/>
        <extension module="org.jboss.as.web"/>
        <extension module="org.jboss.as.weld"/>
    </extensions>
    <management>
        <security-realms>
            <security-realm name="PropertiesMgmtSecurityRealm">
                <authentication>
                    <properties path="mgmt-users.properties" relative-to="jboss.server.config.dir"/>
                </authentication>
            </security-realm>
        </security-realms>
        <management-interfaces>
            <native-interface interface="management" port="9999"/>
            <http-interface interface="management" port="9990"/>
        </management-interfaces>
    </management>
    <profile>
        <subsystem xmlns="urn:jboss:domain:logging:1.1">
            <console-handler name="CONSOLE" autoflush="true">
                <level name="INFO"/>
                <formatter>
                    <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
                </formatter>
            </console-handler>
            <periodic-rotating-file-handler name="FILE" autoflush="true">
                <level name="INFO"/>
                <formatter>
                    <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
                </formatter>
                <file relative-to="jboss.server.log.dir" path="server.log"/>
                <suffix value=".yyyy-MM-dd"/>
                <append value="true"/>
            </periodic-rotating-file-handler>
            <logger category="com.arjuna">
                <level name="WARN"/>
            </logger>
            <logger category="org.apache.tomcat.util.modeler">
                <level name="WARN"/>
            </logger>
            <logger category="sun.rmi">
                <level name="WARN"/>
            </logger>
            <root-logger>
                <level name="INFO"/>
                <handlers>
                    <handler name="CONSOLE"/>
                    <handler name="FILE"/>
                </handlers>
            </root-logger>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:datasources:1.0">
            <datasources>
                <datasource jndi-name="java:/datasources/PortalScopeWeb" pool-name="psw" enabled="true" jta="true" use-java-context="true" use-ccm="true">
                    <connection-url>
                        jdbc:oracle:thin:@172.21.12.149:1521:orcl
                    </connection-url>
                    <driver>
                        oracle
                    </driver>
                    <security>
                        <user-name>
                            psw_fase3_vanessa
                        </user-name>
                        <password>
                            scope
                        </password>
                    </security>
                </datasource>
                <datasource jndi-name="java:/datasources/PortalScopeWeb_Transacao" pool-name="psw" enabled="true" jta="true" use-java-context="true" use-ccm="true">
                    <connection-url>
                        jdbc:oracle:thin:@172.21.12.149:1521:orcl
                    </connection-url>
                    <driver>
                        oracle
                    </driver>
                    <security>
                        <user-name>
                            psw_fase3_vanessa
                        </user-name>
                        <password>
                            scope
                        </password>
                    </security>
                </datasource>
                <drivers>
                    <driver name="sqlServer" module="com.sqlServer">
                        <xa-datasource-class>
                            com.microsoft.sqlserver.jdbc.SQLServerDriver
                        </xa-datasource-class>
                    </driver>
                    <driver name="oracle" module="com.oracle.ojdbc6">
                        <xa-datasource-class>
                            oracle.jdbc.OracleDriver
                        </xa-datasource-class>
                    </driver>
                    <driver name="db2" module="com.ibm.db2">
                        <driver-class>
                            com.ibm.db2.jcc.DB2Driver
                        </driver-class>
                    </driver>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>
                            org.h2.jdbcx.JdbcDataSource
                        </xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:deployment-scanner:1.0">
            <deployment-scanner name="default" path="deployments" scan-enabled="true" scan-interval="5000" relative-to="jboss.server.base.dir" deployment-timeout="60"/>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:ee:1.0"/>
        <subsystem xmlns="urn:jboss:domain:ejb3:1.1" lite="true">
            <session-bean>
                <stateless>
                    <bean-instance-pool-ref pool-name="slsb-strict-max-pool"/>
                </stateless>
            </session-bean>
            <pools>
                <bean-instance-pools>
                    <strict-max-pool name="slsb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/>
                </bean-instance-pools>
            </pools>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:infinispan:1.0" default-cache-container="hibernate">
            <cache-container name="hibernate" default-cache="local-query">
                <local-cache name="entity">
                    <eviction strategy="LRU" max-entries="10000"/>
                    <expiration max-idle="100000"/>
                </local-cache>
                <local-cache name="local-query">
                    <eviction strategy="LRU" max-entries="10000"/>
                    <expiration max-idle="100000"/>
                </local-cache>
                <local-cache name="timestamps">
                    <eviction strategy="NONE"/>
                </local-cache>
            </cache-container>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>
        <subsystem xmlns="urn:jboss:domain:jca:1.0">
            <archive-validation enabled="false"/>
            <bean-validation enabled="false"/>
            <default-workmanager>
                <short-running-threads blocking="true" allow-core-timeout="false">
                    <core-threads count="10" per-cpu="20"/>
                    <queue-length count="10" per-cpu="20"/>
                    <max-threads count="10" per-cpu="20"/>
                    <keepalive-time time="10" unit="SECONDS"/>
                </short-running-threads>
                <long-running-threads blocking="true" allow-core-timeout="false">
                    <core-threads count="10" per-cpu="20"/>
                    <queue-length count="10" per-cpu="20"/>
                    <max-threads count="10" per-cpu="20"/>
                    <keepalive-time time="10" unit="SECONDS"/>
                </long-running-threads>
            </default-workmanager>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:jmx:1.0">
            <jmx-connector server-binding="jmx-connector-server" registry-binding="jmx-connector-registry"/>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:jpa:1.0">
            <jpa default-datasource=""/>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:naming:1.0"/>
        <subsystem xmlns="urn:jboss:domain:osgi:1.0" activation="lazy">
            <configuration pid="org.apache.felix.webconsole.internal.servlet.OsgiManager">
                <property name="manager.root">
                    jboss-osgi
                </property>
            </configuration>
            <properties>
                <property name="org.jboss.osgi.system.modules">
                    org.apache.commons.logging,
                                                                                                                                                                                     org.apache.log4j,
                                                                                                                                                                         org.jboss.as.osgi,
                                                                                                                                                                                      org.slf4j,
                </property>
                <property name="org.osgi.framework.startlevel.beginning">
                    1
                </property>
                <property name="org.osgi.framework.system.packages.extra">
                    org.apache.commons.logging;version=1.1.1,                                                                                                                                                                                    org.apache.log4j;version=1.2,
org.jboss.as.osgi.service;version=7.0,                                                                                                                                                               org.jboss.osgi.deployment.interceptor;version=1.0,
                org.jboss.osgi.spi.capability;version=1.0,
				org.jboss.osgi.spi.util;version=1.0, 
				org.jboss.osgi.testing;version=1.0,
                org.jboss.osgi.vfs;version=1.0,
                org.slf4j;version=1.5.10,
                </property>
            </properties>
            <modules>
                <module identifier="javaee.api"/>
                <module identifier="org.jboss.logging"/>
                <module identifier="org.apache.aries.util"/>
                <module identifier="org.jboss.osgi.webconsole"/>
                <module identifier="org.osgi.compendium"/>
                <module identifier="org.apache.felix.log" startlevel="1"/>
                <module identifier="org.jboss.osgi.logging" startlevel="1"/>
                <module identifier="org.apache.felix.configadmin" startlevel="1"/>
                <module identifier="org.jboss.as.osgi.configadmin" startlevel="1"/>
                <module identifier="org.apache.aries.jmx" startlevel="2"/>
                <module identifier="org.apache.felix.eventadmin" startlevel="2"/>
                <module identifier="org.apache.felix.metatype" startlevel="2"/>
                <module identifier="org.apache.felix.scr" startlevel="2"/>
                <module identifier="org.apache.felix.webconsole" startlevel="2"/>
                <module identifier="org.jboss.osgi.jmx" startlevel="2"/>
                <module identifier="org.jboss.osgi.http" startlevel="2"/>
                <module identifier="org.jboss.osgi.blueprint" startlevel="3"/>
                <module identifier="org.jboss.osgi.webapp" startlevel="3"/>
                <module identifier="org.jboss.osgi.xerces" startlevel="3"/>
            </modules>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:remoting:1.0"/>
        <subsystem xmlns="urn:jboss:domain:resource-adapters:1.0"/>
        <subsystem xmlns="urn:jboss:domain:sar:1.0"/>
        <subsystem xmlns="urn:jboss:domain:security:1.0">
            <security-domains>
                <security-domain name="other" cache-type="default">
                    <authentication>
                        <login-module code="Disabled" flag="required"/>
                    </authentication>
                </security-domain>
            </security-domains>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:threads:1.0"/>
        <subsystem xmlns="urn:jboss:domain:transactions:1.0">
            <core-environment>
                <process-id>
                    <uuid/>
                </process-id>
            </core-environment>
            <recovery-environment socket-binding="txn-recovery-environment" status-socket-binding="txn-status-manager"/>
            <coordinator-environment default-timeout="300"/>
            <object-store/>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:web:1.0" default-virtual-server="default-host">
            <connector name="http" protocol="HTTP/1.1" socket-binding="http" scheme="http"/>
            <virtual-server name="default-host" enable-welcome-root="true">
                <alias name="localhost"/>
                <alias name="172.20.24.48"/>
            </virtual-server>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:weld:1.0"/>
    </profile>
    <interfaces>
        <interface name="management">
            <inet-address value="127.0.0.1"/>
        </interface>
        <interface name="public">
            <inet-address value="172.20.24.48"/>
        </interface>
    </interfaces>
    <socket-binding-group name="standard-sockets" default-interface="public">
        <socket-binding name="http" port="8084"/>
        <socket-binding name="https" port="8443"/>
        <socket-binding name="jmx-connector-registry" port="1090"/>
        <socket-binding name="jmx-connector-server" port="1091"/>
        <socket-binding name="jndi" port="1099"/>
        <socket-binding name="osgi-http" port="8090"/>
        <socket-binding name="remoting" port="4447"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
    </socket-binding-group>
</server>

Agradeço a ajuda de vocês.

7 Respostas

vanegomesl

Pessoal, consegui solucionar indo atrás de documentação… Isso aconteceu com as mudanças do JBoss AS 7.

A solução foi colocar dentro da tag <datasource> algumas outras tags dentro de uma maior chamada <validation>.

Ficando assim:

&lt;datasource jndi-name="java:/datasources/PortalScopeWeb" pool-name="psw" enabled="true" jta="true" use-java-context="true" use-ccm="true"&gt; ... &lt;validation&gt; &lt;check-valid-connection-sql&gt; SELECT 1 FROM [b]ALGUMA TABELA[/b] &lt;/check-valid-connection-sql&gt; &lt;validate-on-match&gt; false &lt;/validate-on-match&gt; &lt;background-validation&gt; false &lt;/background-validation&gt; &lt;use-fast-fail&gt; true &lt;/use-fast-fail&gt; &lt;/validation&gt; &lt;/datasource&gt;

E a razão é a seguinte (tirada do link https://community.jboss.org/wiki/configdatasources ):

<check-valid-connection-sql> - an sql statement that is executed before it is checked out from the pool (see <validate-on-match>) to make sure it is still valid. If the sql fails, the connection is closed and new ones created. Also it will be used by <background-validation>

<validate-on-match> - whether to validate the connection when the JCA layer matches a managed connection (i.e. when the connection is checked out of the pool). With the addition of <background-validation> this is not necessarily required. Note: Specifying “true” for <validate-on-match> is typically not done in conjunction with specifying “true” for <background-validation> as this would be overkill in most scenarios. Default is true.

<background-validation> - In JBoss 4.0.5 background connection validation was added to help reduce the overall load on the RDBMS system when validating a connection. When using this feature, JBoss will attempt to validate the current connections in the pool is a seperate thread (ConnectionValidator). This must be set to true for <background-validation-minutes> to take effect. Default is false.

<use-fast-fail> - whether or not to continue to attempt to acquire a connection from the pool even if the nth attempt has failed. This is to address performance issues where validation SQL takes significant time and resources to execute. Default is false.

Hebert_Coelho

Boa! Valeu pela dica! =D

vanegomesl

Por nada!

Quem tiver uma soluçao melhor posta aí, mas acho que varia de acordo com o que se precisa do servidor.

P

Vanegomes,
Estou com um problema de conexões fechadas com o Oracle.

O banco está se comportando de forma atípica e fechando conexões, aparentemente essa sua configuração faz um tratamento pós falha. Correto?

rodrigo.uchoa

Vanegomes,
Estou com um problema de conexões fechadas com o Oracle.

O banco está se comportando de forma atípica e fechando conexões, aparentemente essa sua configuração faz um tratamento pós falha. Correto?

Pedro,

O comportamento padrão do JBoss é NÃO verificar se as conexões do pool ainda estão ativas antes de usar.
Então quando uma conexão é fechada, por exemplo se a máquina do banco for reiniciada ou houver algum problema de rede,
o JBoss vai tentar usar as conexões do pool normalmente, sem levar isso em consideração. E ai é pau na certa.

Acredito que para evitar o seu problema, no caso do Oracle, é só usar um “connection checker”.
O JBoss já fornece alguns para a maioria dos bancos.
No caso do Oracle o seu datasource poderia ficar mais ou menos assim. (isso é para JBoss 7):

&lt;datasource jndi-name="java:jboss/MyOracle" pool-name="bd-oracle-pool"&gt; &lt;connection-url&gt;jdbc:oracle:thin:@//10.0.0.1:1521/XE&lt;/connection-url&gt; &lt;security&gt; &lt;user-name&gt;myuser&lt;/user-name&gt; &lt;password&gt;12345&lt;/password&gt; &lt;/security&gt; &lt;pool&gt; &lt;max-pool-size&gt;5&lt;/max-pool-size&gt; &lt;/pool&gt; &lt;validation&gt; &lt;valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/&gt; &lt;exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/&gt; &lt;/validation&gt; &lt;driver&gt;ojdbc6.jar&lt;/driver&gt; &lt;/datasource&gt;

Olha o trecho na linha 10, a tag <validation>. Isso deve resolver seu problema.

P

Obrigado Rodrigo, mais uma dúvida.

Com essa configuração, o ping é efetuado antes de realizar a conexão, e caso o ping não possa ser realizado uma nova conexão é criada e substituida de forma transparente a quem utiliza o pool?

rodrigo.uchoa

Exato. Ele verifica se a conexão é válida antes de entrega-la aos clientes do pool.

Se a conexão morreu, ele cria uma nova. Há um overhead nessa operação claro, mas se a conexão ta caindo você não tem escolha.

Criado 15 de janeiro de 2013
Ultima resposta 26 de mai. de 2014
Respostas 7
Participantes 4