terça-feira, 19 de março de 2013

Conexão ao banco de dados SQL Server via JDBC


  • java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.
  • java.sql.SQLException: Unable to get information from SQL Server
  • java.sql.SQLException: Network error IOException: Connection refused: connect SQL Express
  • e muito mais!

Tudo isso, você e eu encontramos facilmente quando tentamos nos conectar a um banco de dados SQL Server via JDBC. Visando a redução das despesas mundiais com analgésicos, estou escrevendo esse post para que os desenvolvedores Java possam facilmente configurar sua conexão JDBC com SQL Server. Seguem as dicas:
  • Use o JTDS. O Driver da Microsoft é amaldiçoado e fará você perder muito tempo tentando configurar até desistir e ficar frustrado para, só então, resolver usar o JTDS.
  • Existem 4 protocolos de comunicação com o SQL Server: TCP/IP, Named Pipes, VIA e Shared Memory. Os dois primeiros são os mais usados, por isso, vou descrever apenas esses dois casos:
  • TCP/IP: 
    • É o meio limpo e bonito e joiado de se trabalhar, por isso, procure usá-lo sempre.
    • Usa conexões TCP para comunicação com o SQL Server.
    • Garanta que o protocolo TCP/IP esteja habilitado no SQL Server Configuration Manager -> SQL Server 2005 Network Configuration, Protocols for SQL2005  (nome da instancia)
    • Abrindo as propriedades do protocolo TCP/IP, podemos definir quais IPs terão acesso ao banco. Normalmente ativo todos e no final, em IP All, coloco TCP Port: 1433
    • Após modificar os protoclos, é preciso reiniciar o serviço SQLServer para ativar as novas configurações e, infelizmente, algumas vezes elas não funcionam até que se reinicie o servidor.
    • Garanta também que o serviço SQL Server Browser está ativo e na inicialização automática
    • Para acesso externo, é preciso configurar o firewall também para liberar as portas TCP 1433 e UDP 1434
    • Strings de conexão:
      • Driver: net.sourceforge.jtds.jdbc.Driver
      • URL: jdbc:jtds:sqlserver://<nome ou IP do servidor>:1433/<nome da base de dados>;instance=<nome da instância>
      • Exemplo de URL: jdbc:jtds:sqlserver://ceres:1433/Netuno;instance=SQL2005
      • O número da porta só é obrigatório ser o servidor estiver rodando em outra porta
  • Named Pipes: 
    • É a forma nojenta que a Microsoft usa como padrão para o SQL Server.
    • Utiliza troca de arquivos em uma pasta compartilhada para comunicação entre o servidor e os clientes (falei que era nojento)
    • Por ser padrão, normalmente não é preciso configurar o servidor. Se for o caso, basta habilitar o protocolo Named Pipes no SQL Server Configuration Manager -> SQL Server 2005 Network Configuration, Protocols for SQL2005  (nome da instância)
    • Para acesso externo, é preciso garantir que a máquina cliente esteja no mesmo domínio do servidor ou tenha permissão para acessar os compartilhamentos do servidor. Para se certificar disso, basta acessar o servidor pelo Windows Explorer.
    • Strings de conexão:
      • Driver: net.sourceforge.jtds.jdbc.Driver
      • URL: jdbc:jtds:sqlserver://<nome ou IP do servidor>/<nome da base de dados>;instance=<nome da instância>;namedPipe=true
      • Exemplo de URL: jdbc:jtds:sqlserver://ceres/Netuno;instance=SQL2005;namedPipe=true
Seguindo estas instruções, sua conexão JDBC deve funcionar. Se ainda assim houver problema, envie a descrição do teu caso e terei prazer em adicionar as dicas para solução neste post!



Um comentário:

  1. Olá, estou com um problema para usar nome ao invés de ip, por exemplo: teste.ddns.com.br (já testado pelo SQL SERVER 2005), ou seja, só conecta utilizando o ip público.

    ResponderExcluir