Strict Standards: Non-static method themeGluedIdeas_Subtle::initOptions() should not be called statically in /home/riopro/www/blog.riopro.com.br/wp-content/themes/gluedideas_subtle/header.php on line 19
Riopro Blog - » Conectando a instâncias do MSSqlServer por JDBC

Conectando a instâncias do MSSqlServer por JDBC



Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/riopro/www/blog.riopro.com.br/wp-includes/formatting.php on line 82

Acredito que Java seja, hoje em dia, uma das linguagens com suporte ao maior número de SGBD’s. Nessa linha, conectar-se a um servidor MSSqlServer se tornou, já a algum tempo, algo trivial em Java.

Apesar de não ser o produto oficial da Microsoft, o jTDS é a solução mais completa e utilizada no mercado para uso de Java.

Utilizando o jTDS, o suporte à especificação JDBC3 é amplamente garantida e é bem superior ao próprio conector disponibilizado pela Microsoft (o microsoft.jar). O próprio texto introdutório assegura o suporte a:

“…Microsoft SQL Server (6.5, 7, 2000 and 2005) and Sybase (10, 11, 12, 15)…”

Não pretendemos explicar aqui como criar conexões simples ao MSSqlServer, para isso temos o FAQ do próprio jTDS. O que solucionar são os problemas enfrentados ao tentar nos conectar a instâncias (instance) e clusters do MSSqlServer.

Uma instância para o MSSqlServer foi a forma encontrada pela Microsoft para manter mais de um servidor de banco de dados em uma mesma máquina (seja ele da mesma versão ou de versões diferentes). Foi também a forma utilizada para que cluster de servidores possa ser identificado na rede de forma única.

O jTDS suporta a chamada de instâncias. Oficialmente, a url de chamada seria:

url="jdbc:jtds:SERVER_TYPE://SERVER_NAME[:PORT][/DATABASE_NAME];instance=INSTANCE_NAME"

SERVER_TYPE no nosso caso será sqlserver e PORT só é necessária se não for a padrão (1433). INSTANCE_NAME é o nome da instância que queremos acessar. Como estamos colocando a INSTANCE_NAME, não declaramos qual a porta (pois cada instância usa uma porta).
Apesar do jTDS prever a conexão por instâncias, muitas vezes um erro de conexão ocorre por não encontrar a instância. Nesses casos, existem 2 outras formas de conectar que conseguem surtir efeito.

A primeira pode ser utilizada somente com instâncias, enquanto a segunda foi a única que conseguimos, pelo menos até agora, conectar a um cluster.

1) Trocar o número da porta para o número da porta utilizada pela instância:

url="jdbc:jtds:SERVER_TYPE://SERVER_NAME[:INSTANCE_PORT][/DATABASE_NAME]"

Off-topic: Se você tem dúvida sobre como encontrar a porta do servidor MSSqlServer que está ouvindo a instância, pode usar o nmap do Linux para rastrear as portas do servidor

$nmap -A NUMERO_DO_IP

Ele vai cuspir algo como:

1433/tcp open  ms-sql-s?
3268/tcp open  ldap         Microsoft LDAP server
3269/tcp open  tcpwrapped
3372/tcp open  msdtc        Microsoft Distributed Transaction Coordinator

Acusando quais as portas existentes (no caso o servidor acima está instalado com a porta padrão, e por isso ele atribui o nome ms-sql-s?, se estivesse em outra porta ele dá o nome do padrão da porta, aí, só testando).
2) Colocar a url normalmente e acrescentar os dados da instância/cluster no properties de conexão. Ficaria assim:

Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
String serverName = "SERVER_NAME";
String mydatabase = "DATABASE_NAME";
String username = "LOGIN";
String password = "PASSWORD";
String url = "jdbc:jtds:sqlserver://" + serverName + "/" + mydatabase;
Properties properties = new Properties ();
properties.put("user", username);
properties.put("password", password);
properties.put("TDS", "8.0");
properties.put("instance", "INSTANCE_NAME");
Connection conexao = DriverManager.getConnection(url, username, password);

Off-topic: Aqui vale uma explicação. TDS significa Tabular Data Stream e é o protocolo desenvolvido originalmente pela Sybase, cujo servidor foi a base para o MSSqlServer (a partir da versão 7). TDS 8.0 é compatível com as versões 7.0, 2000 e 2005, enquanto a versão 7.0 só é compatível com as versões 7.0 e 2000.

Bom uso!

Informações e Links

Junte-se comentando, lendo o que os outros dizem ou colocando um link a partir do seu blog.


Outros Artigos

Strict Standards: Only variables should be assigned by reference in /home/riopro/www/blog.riopro.com.br/wp-includes/post.php on line 117
Fazendo um Merge sem fazer besteira

Strict Standards: Only variables should be assigned by reference in /home/riopro/www/blog.riopro.com.br/wp-includes/post.php on line 117
Disponibilizando streamings de áudio na sua rede

Comente

Tire um tempo para comentar e nos dizer o que você acha. Alguns códigos HTML são permitidos para formatação.

Comentários dos Leitores


Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/riopro/www/blog.riopro.com.br/wp-includes/formatting.php on line 82

Cara bem legal essa sua classe para conexão mais como ficaria usando a autenticação do windows.


Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/riopro/www/blog.riopro.com.br/wp-includes/formatting.php on line 82

Não ficaria porque não é feita para isso.

Você teria que integrar com a autenticação de usuários e só funcionaria com o IE (O FF não gerenciaria credenciais do windows). Depois, porque faria isso? É muito menos seguro (pois pode acabar permitindo acesso direto do usuário às tabelas, comprometendo a integridade dos dados). Eu não faria isso.