Pergunta

Estamos tendo problemas com uma aplicação web Java rodando dentro de Tomcat 6 que usa JDBC para conectar a um banco de dados SQL Server.

Depois de alguns pedidos, as matrizes de servidor de aplicativos e o nos arquivos de log encontramos exceções relacionadas a falhas de conexão banco de dados.

Nós não estamos usando qualquer pool de conexão no momento e nós estamos usando a ponte padrão driver JDBC / ODBC / ADO para se conectar ao SQL Server.

Devemos considerar usando o pool de conexão para eliminar o problema?

Além disso, devemos mudar o nosso motorista para algo como jTDS?

Foi útil?

Solução

Esse é o comportamento correto se você não está fechando suas conexões JDBC.

Você tem que chamar o método close () de cada recurso JDBC quando terminar de usá-lo e os outros recursos JDBC obtidas com ele.

Isso vale para Connection, Statement / PreparedStatement / CallableStatement, ResultSet, etc.

Se você não fizer isso, você está acumulando potencialmente enorme e provavelmente recursos muito limitados no servidor SQL, para começar.

Por fim, não será concedido conexões, obter consultas para executar e resultados de retorno irá falhar ou travar.

Você também pode notar sua inserção ATUALIZAÇÃO / declarações / apagar pendurado se você deixar de commit () ou rollback () na conclusão de cada transação, se você não tiver definido autoCommit propriedade para true.

O que tenho visto é que, se você aplicar o rigor mencionado acima para o código do cliente JDBC, em seguida, JDBC e seu servidor SQL irá funcionar maravilhosamente bem. Se você escrever porcaria, então tudo vai se comportar como lixo.

Muitas pessoas escrevem JDBC chamadas esperando "algo" mais para liberar cada coisa chamando close () porque isso é chato e a aplicação e servidor não falhar imediatamente quando eles deixam isso.

Isso é verdade, mas os programadores têm escrito seus programas para jogar "99 garrafas de cerveja na parede" com o seu servidor (s).

Os recursos irão tornar-se esgotado e os pedidos tendem a resultar em um ou mais dos seguintes acontecendo: as solicitações de conexão falhar imediatamente, instruções SQL falhar imediatamente ou pendurar para sempre ou até que algum godawful longa temporizador tempo limite da transação expirar, etc

Portanto, a maneira mais rápida para resolver esses tipos de problemas SQL é não culpar o servidor SQL, o servidor de aplicativos, o container web, drivers JDBC, ou a decepcionante falta de inteligência artificial embutidos no coletor de lixo Java.

A maneira mais rápida para resolvê-los é atirar o cara que escreveu as chamadas JDBC em seu aplicativo que fale com o seu servidor SQL com um dardo Nerf. Quando ele diz: "O que você fez isso para ...?!" Basta apontar a este post e dizer-lhe para lê-lo. (Lembre-se para não atirar para os olhos, as coisas em suas mãos, material que pode ser perigoso / frágil, etc.)

Como para pool de conexão resolver seus problemas ... não. Desculpe, pools de conexão simplesmente acelerar a chamada para obter uma conexão em seu aplicativo por entregá-lo, uma conexão pré-alocada talvez reciclado.

O puts fada de dente dinheiro debaixo do travesseiro, as Páscoa puts coelho ovos e doces sob os arbustos e Santa põr Cláusula presentes sob sua árvore. Mas, desculpe a quebrar suas ilusões -. O servidor SQL e driver JDBC não fechar tudo, porque você "esqueceu" para fechar todas as coisas que você yourself alocados

Outras dicas

Eu definitivamente dar jTDS uma tentativa. Eu usei-o no passado com Tomcat 5.5 sem problemas. Parece que uma mudança impacto relativamente rápido, de baixo para fazer como um passo de depuração. Eu acho que você vai encontrá-lo mais rápido e mais estável. Ele também tem a vantagem de ser de código aberto.

No longo prazo, eu acho que você vai querer olhar para o pool de conexão por motivos de desempenho. Quando o fizer, eu recomendo ter um olhar para c3p0 . Eu acho que é mais flexível do que o construído em pooling opções para Tomcat e eu geralmente preferem "fora do recipiente" soluções de modo que é menos doloroso para mudar recipientes no futuro.

É difícil dizer, porque realmente você forneceu tão pouca informação sobre a falha real:

Depois de alguns pedidos, a aplicação dies servidor e o nos arquivos de log encontramos exceções relacionadas ao banco de dados falhas de conexão.

Você pode nos dizer:

  • exatamente o que o erro é que você está vendo
  • dar-nos uma pequena exemplo do código onde você Connect e um de serviço de seu solicitações
  • é depois de uma consistente número de transações que falha, ou é aparentemente aleatória

Eu escrevi um monte de código java banco de dados relacionados (praticamente todo o meu código é banco de dados relacionado), e usou o driver MS, o motorista jdt, eo de jnetDirect.

Eu tenho certeza que se você nos fornecer mais detalhes, podemos ajudá-lo.

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