A motivação por trás deste artigo foi a dificuldade que encontrei em obter uma conexão com o banco de dados SQL Server 2005 EXPRESS, através de um DataSource configurado no JBoss.
 
Considere como cenário a utilização das versões JBoss-4.0.5.GA e SQL SERVER 2005 EXPRESS.
 
Desenvolvo um projeto pessoal onde o banco de dados a ser utilizado deve ser o SQL Server 2005.
O cliente possui este banco de dados instalado e não pretende adotar outro.
Sendo assim, fiz o download da versão SQL SERVER 2005 EXPRESS, para o início do desenvolvimento do sistema, em meu notebook.
 
É boa prática que o pool de conexões de banco de dados de uma aplicação seja gerenciado pelo servidor de aplicação. Para que você delegue esta responsabilidade ao JBoss, é preciso configurar DataSources.
DataSources são mapeamentos em XML que permitem que as informações de conexão com o(s) banco(s) de dados, que serão utilizados pela sua aplicação, sejam aproveitadas pelo servidor de aplicações que, afinal de contas, será o responsável por gerenciar as conexões com o(s) banco(s) de dados.
O uso de DataSources também é uma interessante forma de se retirar as informações de conexão com bancos de dados de dentro do código-fonte de um sistema, de maneira a facilitar a manutenção destas informações, quando houver alguma alteração (ou seja: basta alterar o XML, sem precisar subir toda a aplicação, ou parte dela, só porque aquele DBA gente fina resolveu mudar o nome do usuário que se conecta ao banco de dados da sua aplicação).
 
Sendo assim, após verificar a consistência da instalação do SQL SERVER 2005 EXPRESS e após criar o banco de dados da minha aplicação, bem como seus objetos (tabelas, usuarios, etc), comecei as tarefas necessárias para delegar ao JBoss a função de gerenciamento de conexões de banco de dados da minha aplicação:
 
1a. Tarefa: Falou em Java e acesso a banco de dados, falou em Driver.
Sendo assim, a primeira tarefa foi obter o Driver que se deve utilizar para conectar uma aplicação Java a um banco de dados SQL Server 2005 EXPRESS.
Este driver pode ser obtido aqui.
Após colocar o Driver em "${diretorio.raiz.da.minha.aplicacaoWeb}\WEB-INF\lib\", passei à segunda tarefa, que é a definição do DataSource da minha aplicação.
 
2a. Tarefa: Mapeei as características do DataSource da minha aplicação em um arquivo XML e coloquei este XML em "${diretorio.de.instalacao.do.JBoss}\server\default\deploy".
 
Segue a configuração de DataSource efetuada:
 
meuProjeto-ds.xml
     
 
3a. Tarefa: Após criar o DataSource, criei a classe e o método responsável por obter conexões de banco de dados diretamente do pool de conexões do JBoss.
Algo como:
 
public class MinhaDBClasse {

    protected static DataSource datasource;

     public Connection getConnection() {
              Connection conn = null;
              try {
                    Context initialContext = new InitialContext();
                    datasource = (DataSource)initialContext.lookup("java:jdbc/MeuProjetoDS");
                    conn = datasource.getConnection();
              } catch (Exception e) {
                    e.printStackTrace();
              }
              return conn;    
     }
}
 
Neste momento, o cenário era:
      - o JBoss conhecia a minha conexão com o banco de dados, graças ao DataSource configurado;
      - a minha aplicação estava apta a estabelecer uma comunicação com o SQL Server 2005 EXPRESS, graças ao Driver;
      - a minha aplicação também estava apta a obter uma conexão de banco de dados, diretamente do pool de conexões do JBoss, graças à classe e ao método getConnection() implementados.
 
Sendo assim, só faltava aplicar um teste unitário para garantir que a aplicação estava se conectando corretamente ao banco dados.
 
Para a minha surpresa, a seguinte exceção foi levantada pelo JBoss, enquanto eu executava o teste unitário:

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host has failed. java.net.ConnectException: Connection refused: connect

A regra é clara: a conexão, via TC/IP, com o host do SQL Server havia falhado, o que impossibilitou o servidor de aplicações de obter uma conexão com o banco de dados.
 
Mas por que ocorre esta falha?
A Microsoft assume como padrão que uma instalação de SQL Server 2005, nas versões EXPRESS, DEVELOPER e EVALUATION, só deve permitir conexões locais, sem o uso do protocolo TCP/IP.
Sendo assim, para habilitar o uso do protocolo TCP/IP no seu SQL Server 2005 EXPRESS, é preciso alterar algumas opções de conexão, a saber:
 
1a Tarefa: Acessar a ferramenta "SQL Server Surface Area Configuration"
               (Iniciar->Programas->Microsoft SQL Server 2005->Configuration Tools->SQL Server Surface Area Configuration)
 
 
Clique em "Surface Area Configuration for Services and Connections".
 
Na tela que se abrirá, clique em "Remote Connections".
Perceba que a opção marcada é "Local Connections Only".
Altere esta opção clicando em "Local And Remote Connections" e, logo abaixo, clique em "Using TCP/IP only", conforme imagem a seguir:
 
 
Clique em OK.
Você será alertado sobre o fato de que estas alterações não terão efeito até que o banco de dados seja reiniciado.
Tudo bem, ainda há mais um trabalho a frente.
Feche a tela do "SQL Server Surface Area Configuration".
 
2a Tarefa: Acessar a ferramenta "SQL Server Configuration Manager"
               (Iniciar->Programas->Microsoft SQL Server 2005->Confguration Tools->SQL Server Configuration Manager)
 
 
Nesta ferramenta, você deverá garantir que o TC/IP está, de fato, habilitado.
Expanda, caso necessário, o item "SQL Server 2005 Network Configuration", no lado esquerdo, e clique no sub-item "Protocols for SQLEXPRESS".
Repare na janela do lado direito desta tela.
Caso a opção "TCP/IP" se encontre com o status de "Disabled", clique com o botão direito sobre esta opção e selecione a opção "Enabled".
Logo após, clique novamente com o botão direito sobre a opção "TCP/IP" e, no menu que se abrirá, selecione a opção "Properties". A seguinte tela será apresentada:
 
 
Nesta tela, assegure-se que a opção "Enabled" esteja com o valor igual "Yes".
Caso não esteja, altere esta opção para que fique com o valor igual a "Yes".
Clique em "IP Addesses" e a seguinte tela será apresentada:
 
 
Nesta tela, serão listados até 3 itens de endereços IP (IP1, IP2 e IP3) e um último item "IPAll".
Em todos estes itens você deve digitar o valor de 1433 no campo "TCP Port" (você pode alterar este número de porta, se preferir, mas lembre-se que o número de porta que aqui for definido deverá ser o mesmo número de porta presente na Connection String que foi definida lá em cima, no DataSource).
 
Clique em OK, saia do "SQL Server Configuration Manager", vá em Painel de Controle->Ferramentas Administrativas->Serviços, procure o serviço "SQL Server (SQLEXPRESS)", pare este serviço, inicie o serviço novamente e teste a sua aplicação.
 
O seu JBoss, enfim, estará apto a gerenciar o pool de conexões SQL Server 2005 EXPRESS da sua aplicação.