Existe alguma maneira de ter o JBoss pool de conexão reconexão à Oracle quando as conexões vão mal?

StackOverflow https://stackoverflow.com/questions/128527

Pergunta

Nós temos nossa JBoss e Oracle em servidores separados. As conexões parecem ser descartado e está causando problemas com JBoss. Como posso ter a reconexão JBoss para o Oracle se a conexão é ruim, enquanto nós descobrir por que as conexões estão sendo caiu em primeiro lugar?

Foi útil?

Solução

Geralmente, há uma opção de configuração na piscina para permitir uma consulta de validação para ser executado em emprestar. Se a consulta de validação executado com êxito, a piscina vai voltar essa conexão. Se a consulta não é executada com êxito, a piscina vai criar uma nova conexão.

JBoss Wiki documentos os vários atributos da piscina.

<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>

Parece que ele deve fazer o truque.

Outras dicas

Enquanto você pode usar o velho "selecione 1 dual" truque, a desvantagem com isso é que ele emite uma consulta extra cada vez que você pedir uma conexão do pool. Para grandes volumes, este é um desperdício.

JBoss fornece um validador conexão especial que deve ser usado para Oracle:

<valid-connection-checker-class-name>
    org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
</valid-connection-checker-class-name>

Isso faz uso do método de ping proprietário () na classe de conexão JDBC Oracle e usa o código de rede subjacente do motorista para determinar se a conexão ainda está vivo.

No entanto, ainda é um desperdício para executar este cada vez que uma conexão é emprestado, então você pode querer usar a facilidade onde uma discussão de fundo verifica as ligações no conjunto e descarta silenciosamente os mortos. Isso é muito mais eficiente, mas significa que se as conexões fazer ir morto, qualquer tentativa de usá-los antes da discussão de fundo executa sua verificação irá falhar.

Veja o (olhar para background-validation-millis) wiki docs para saber como configurar a verificação de fundo.

Não rep suficiente para um comentário, por isso é na forma de uma resposta. O método 'Select 1 from dual' de skaffman org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker e são equivalentes, embora a verificação de conexão não fornecem um nível de abstração. Tivemos a decompile motoristas do JDBC Oracle para um exercício de solução de problemas e implementação interna da Oracle o ping é realizar uma 'Select 'x' from dual'. Natch.

JBoss oferece 2 formas de conexão Validar: - baseado Ping E - Consulta baseada

Você pode usar como por obrigação. Isto está programado pelo segmento separado de acordo com a duração definida na fonte de dados arquivo de configuração.

<background-validation>true</background-validation> <background-validation-minutes>1</background-validation-minutes>

Algum tempo se você não está tendo o driver Oracle direita no Jboss, poderá obter erro classcast ou relacionado e para essa conexão pode começar abandono do pool de conexão. Você pode tentar criar sua própria classe ConnectionValidator através da implementação de interface de org.jboss.resource.adapter.jdbc.ValidConnectionChecker. Essa interface fornece único método 'isValidConnection()' single e esperando 'NULL' em troca de conexão válido.

Ex:

public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable {

   private Method ping;

   // The timeout (apparently the timeout is ignored?)
   private static Object[] params = new Object[] { new Integer(5000) };

   public SQLException isValidConnection(Connection c) {

       try {
           Integer status = (Integer) ping.invoke(c, params);

           if (status.intValue() < 0) {
               return new SQLException("pingDatabase failed status=" + status);
           }

       }
       catch (Exception e) {
           log.warn("Unexpected error in pingDatabase", e);
       }

       // OK
       return null;
   }
}

Temos recentemente teve algum pedido flutuante lidar com falhas causadas por bloqueios de sessão oráculo DBMS_LOCK órfãos que retidos indefinidamente em pool de conexão do lado do cliente.

Então aqui é uma solução que a caducidade sessão forças em 30 minutos, mas não afeta o funcionamento do aplicativo:

<check-valid-connection-sql>select case when 30/60/24 > sysdate-LOGON_TIME then 1 else 1/0 end 
from V$SESSION where AUDSID = userenv('SESSIONID')</check-valid-connection-sql>

Isto pode envolver alguma desaceleração no processo de obtenção de conexões de piscina. Certifique-se de testar esta sob carga.

Um pouco atualização para resposta de @ skaffman. Em JBoss 7 você tem que usar atributo "class-name" ao definir verificador de conexão válida e também pacote é diferente:

<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker" />

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top