Olá a todos.
Estou com uma dúvida de conexão com o Banco de Dados Oracle. Tenho um Sistema desenvolvido em Java com uma conexão do tipo JDBC thin como segue no código abaixo.
O que tem acontecido é que de tempos em tempos é apresentado o erro de “Connection reset by peer: socket write error” e somente um restart no contêiner da aplicação é que a mesma volta a funcionar. O Servidor de Aplicação é o Oracle 9 IAS.
Veja pelo código abaixo que existe uma variável estática chamada “conn”, “conectar” e um método estático “getConnection”.
Classe ServicoConexao:
import java.sql.*;
import oracle.jdbc.OracleDriver;
public class ServicoConexao
{
private static boolean conectar = true;
private static Connection conn = null;
public static Connection getConnection () throws java.lang.Exception,SQLException
{
if (conectar)
{
DriverManager.registerDriver (new OracleDriver());
conn = DriverManager.getConnection(“string de conexao”, “usuario”,”senha”);
conn.setAutoCommit(false);
conectar = false;
}
return(conn);
}
}
Ou seja, com a classe ServicoConexao acima é aberta uma única conexão com o Banco de Dados Oracle o qual se manterá ativa para todos os usuários que entrarem no Sistema. Isso porque o método é estático, a variável “conn” é estática e somente entrará no “if (conectar)” do método “getConnection” somente na primeira vez em que for executada.
Pergunto: o fato de ser uma única conexão “conn” como acontece quando dois ou mais usuários pedirem a conexão??? Isso não traz um problema para vários pedidos de acesso ao banco que somente ocorrerá pela essa variável “conn”???
Já dei o comando “SELECT * FROM USER_RESOURCES_LIMITS” no Banco de dados Oracle que retorna (abaixo) que não existe limite de tempo (timeout) para a conexão com o banco.
RESOURCE_NAME----------------------------LIMIT
COMPOSITE_LIMIT---------------------------- UNLIMITED
SESSIONS_PER_USER------------------------ UNLIMITED
CPU_PER_SESSION--------------------------- UNLIMITED
CPU_PER_CALL-------------------------------- UNLIMITED
LOGICAL_READS_PER_SESSION------------- UNLIMITED
LOGICAL_READS_PER_CALL------------------- UNLIMITED
IDLE_TIME---------------------------------------- UNLIMITED
CONNECT_TIME----------------------------------- UNLIMITED
PRIVATE_SGA------------------------------------- UNLIMITED
Acredito que a conexão por ser única de alguma forma depois de algum tempo de inatividade está ficando inválida e o Sistema não mais consegue se restabelecer o link com o Banco de dados Oracle.
Orientaram-me a usar pool de conexões, mas não estou conseguindo criar o pool. Sempre esta dando erro “javax.naming.NoInitialcontextException”.
O pool pegará de uma única vez, por exemplo, 5 conexões com o banco e ficará administrando estas conexões até que seja necessário mais conexões. Pergunto: A variável criada para o pool (cache) também não será única e somente quando precisar de novas conexões adicionais é que a mesma se comunicará com o banco??? Se for neste meu pensamento, também, se tornará inválida após o sistema ficar por muito tempo sem atividade dando o erro novamente.
Pergunto: O que eu poderia fazer para me livrar deste problema de conexão??? Que tipo de alteração terei que implementar para me livrar deste problema???
Observação: O Sistema não tem implementado Sessão nem tem configuração de timeout no Web.xml.
Pergunta: Como posso destruir a variável estática “conn” da memória??? Existe algum método??? Não estou pensando em “conn.close()”. Algo do tipo como destruir da memória, limpar da memória como faria o Garbage Collection.
Muito grato pela ajuda.
MPSV