Conexão Java

1 resposta
M

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

1 Resposta

T

Ola… uma coisa de cada vez…

MPSV:
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”???


o que acontece eh que várias entidades vao ter uma referencia para uma mesma connection o que, como vc mesmo disse, eh ruim (statements e resultsets nao sao feitos para uso concorrente)…
vc estah usando isso em ambiente web? se for, eh melhor configurar o seu container web para te dar as conexoes (acho q tds eles tem algum mecanismo para isso) atraves de um pool…

consulte a documentacao do pool que vc esta usando, mas falta voce setar (ou mandar o pool setar) uma propriedade de sistema (algo como System.getProperties().put ( “”, “classe_do_jdni”) ), mas eu nao me recordo de cabeca o nome da chave…
ainda assim, se for ambiente web, a dica acima continua: use o pool que o seu container te oferece…

se mesmo com o pool o erro continuar, , o problema pode estar em outro lugar…
e nao se preocupe com as conexoes no pool… mesmo invalidadas, o pool (normalmente) vai se conectar de novo “sozinho”…

para “limpar” da memoria, sete todas as referencias para o Objeto para null, incluindo os “usuários” da sua conexao (ou seja, as outras classes que obtem a Connection atraves desta classe) que o resto o gc se encarrega…

t+

Criado 23 de junho de 2006
Ultima resposta 26 de jun. de 2006
Respostas 1
Participantes 2