Mesma conexão no POOL

4 respostas
F

Olá… Depois de ficar batendo no connection is closed em minha aplicação descobri que o problema é que ele não desconecta de certa forma
errado e sim a conexão que mesmo para sessões diferentes pega sempre a mesma conexão…
Ai o primeiro que desconecta da erro… Gostaria de saber se alguem sabe como resolver isso…
tipo preciso que cada sessão pegue uma conexão diferente do pool…
pois depois que utiliza a conexão a aplicação esta devolvendo normalmente para o pool… Segue erro abaixo:

nesse esquema fiz para saber qual conexão foi pega no momento…

SESSÃO 1

PEGA A CONEXÃO org.apache.commons.dbcp.PoolableConnection@5eb489

SELECT    SELECT    TESTE.CPAGARCENTRAL.flag_data_balanco,TESTE.CPAGARCENTRAL.data_vencimento,
TESTE.CPAGARCENTRAL.valor,TESTE.CPAGARCENTRAL.historico,TESTE.CPAGARCENTRAL.id_parametriza_usu,
TESTE.CPAGARCENTRAL.id_pessoa_usu,TESTE.CATEGORIA_CONTA_PAGAR.categoria_conta_pagar,
TESTE.SUB_CATEGORIACPAGAR.sub_categoria WHERE TESTE.CPAGARCENTRAL.id_categoria_conta_pagar=TESTE.CATEGORIA_CONTA_PAGAR.id_categoria_conta_pagar  AND TESTE.CPAGARCENTRAL.id_cpagarcentral=45 AND TESTE.CPAGARCENTRAL.id_sub_categoriacpagar=TESTE.SUB_CATEGORIACPAGAR.id_sub_categoriacpagar  AND TESTE.CPAGARCENTRAL.id_parametriza_usu=2 AND TESTE.CPAGARCENTRAL.flag_sempre_balanco= 'NAO'
SELECT    TESTE.CPAGARCENTRAL.flag_data_balanco,TESTE.CPAGARCENTRAL.data_vencimento,TESTE.CPAGARCENTRAL.valor,
TESTE.CPAGARCENTRAL.historico,TESTE.CPAGARCENTRAL.id_parametriza_usu,TESTE.CPAGARCENTRAL.id_pessoa_usu,
TESTE.CATEGORIA_CONTA_PAGAR.categoria_conta_pagar,TESTE.SUB_CATEGORIACPAGAR.sub_categoria WHERE TESTE.CPAGARCENTRAL.id_categoria_conta_pagar=TESTE.CATEGORIA_CONTA_PAGAR.id_categoria_conta_pagar  AND TESTE.CPAGARCENTRAL.id_cpagarcentral=47 AND TESTE.CPAGARCENTRAL.id_sub_categoriacpagar=TESTE.SUB_CATEGORIACPAGAR.id_sub_categoriacpagar  AND TESTE.CPAGARCENTRAL.id_parametriza_usu=2 AND TESTE.CPAGARCENTRAL.flag_sempre_balanco= 'NAO'

SESSÃO 2

PEGA A CONEXÃO ( QUE A MESMA QUE JA FOI PEGA NA SESSÃO 1)org.apache.commons.dbcp.PoolableConnection@5eb489

FEZ O SELECT E DESCONECTA

SELECT TESTE.DADOS_ORCAMENTO_ON_LINE.placa,TESTE.DADOS_ORCAMENTO_ON_LINE.data_entrega,
TESTE.DADOS_ORCAMENTO_ON_LINE.hora_entrega,TESTE.DADOS_ORCAMENTO_ON_LINE.km_inicial,
TESTE.DADOS_ORCAMENTO_ON_LINE.data_sistema,TESTE.DADOS_ORCAMENTO_ON_LINE.hora_sistema,
TESTE.DADOS_ORCAMENTO_ON_LINE.cliente,TESTE.DADOS_ORCAMENTO_ON_LINE.tel_fixo,TESTE.DADOS_ORCAMENTO_ON_LINE.tel_cel,
TESTE.MARCA_VEICULO.marca_veiculo,TESTE.DADOS_ORCAMENTO_ON_LINE.id_dados_orcamento_on_line,
TESTE.DADOS_ORCAMENTO_ON_LINE.id_portas,TESTE.DADOS_ORCAMENTO_ON_LINE.id_tipos_veiculos, TESTE.DADOS_ORCAMENTO_ON_LINE.data_agendada, TESTE.DADOS_ORCAMENTO_ON_LINE.confirma_faturamento, TESTE.DADOS_ORCAMENTO_ON_LINE.hora_agendada, TESTE.VEICULOS.veiculo,TESTE.TIPOS_VEICULOS.descricao, TESTE.ANO.ano, TESTE.COR.cor, TESTE.CLASSIFICACAO.classificacao, TESTE.RESPOSTA_ENQUETE.RESPOSTA_ENQUETE, TESTE.PARAMETRIZA.codigo_loja, TESTE.PORTAS.portas  FROM TESTE.DADOS_ORCAMENTO_ON_LINE,TESTE.COR,TESTE.VEICULOS,TESTE.ANO,TESTE.RESPOSTA_ENQUETE,
TESTE.CLASSIFICACAO,TESTE.TIPOS_VEICULOS,TESTE.PORTAS WHERE TESTE.DADOS_ORCAMENTO_ON_LINE.PLACA ='AKL0853' AND TESTE.DADOS_ORCAMENTO_ON_LINE.id_parametriza_usu = TESTE.PARAMETRIZA.id_parametriza AND TESTE.DADOS_ORCAMENTO_ON_LINE.id_cor = TESTE.COR.id_cor AND TESTE.DADOS_ORCAMENTO_ON_LINE.id_portas = TESTE.PORTAS.id_portas AND TESTE.DADOS_ORCAMENTO_ON_LINE.id_ano = TESTE.ANO.id_ano AND TESTE.DADOS_ORCAMENTO_ON_LINE.id_marca_veiculo = TESTE.MARCA_VEICULO.id_marca_veiculo AND TESTE.DADOS_ORCAMENTO_ON_LINE.id_tipos_veiculos = TESTE.TIPOS_VEICULOS.id_tipos_veiculos AND TESTE.DADOS_ORCAMENTO_ON_LINE.id_classificacao = TESTE.CLASSIFICACAO.id_classificacao AND TESTE.DADOS_ORCAMENTO_ON_LINE.id_resposta_enquete = TESTE.RESPOSTA_ENQUETE.id_resposta_enquete AND TESTE.DADOS_ORCAMENTO_ON_LINE.id_veiculos = TESTE.VEICULOS.id_veiculos

DESCONECTA

org.apache.commons.dbcp.PoolableConnection@5eb489

AI DA O ERRO :

java.sql.SQLException: Connection is closed.
	at org.apache.commons.dbcp.DelegatingConnection.checkOpen(DelegatingConnection.java:245)
	at org.apache.commons.dbcp.DelegatingConnection.createStatement(DelegatingConnection.java:170)
	at util.DAO.inserirRegistro(DAO.java:445)

Desde ja agradeço…

Fabio Mauricio
[size=“11”][color=“red”]* Editado: Lembre-se de utilizar BBCode em seus códigos - AnjoSupremo[/color][/size] :joia:

4 Respostas

M

Opa,

Bem teu problema se resolve com:

DataSource ds = // obtenha aqui teu dataSource return ds.getConnection() ;

Isto retornará uma conexão do pool de conexões, ou seja, quando você fechar esta conexão volta a estar disponível para ser utilizada novamente.

:okok:

F

Olá ... Obrigado pela resposta... Mais ja estou utilizando assim...

public String conectar()throws NamingException
		{
			String retVal = "";
			try
			{
				Context initCtx = new InitialContext();
				Context envCtx = (Context)initCtx.lookup("java:comp/env");
				DataSource ds = (DataSource)envCtx.lookup("jdbc/teste");
			
				  if (ds != null) {
					fconn = ds.getConnection(); 
				  }
	
			}
			catch(NamingException e)
			{
				retVal = e.toString();
			}
			catch(SQLException e)
			{
				retVal = e.toString();
			}
			return retVal;
		}

O que pode estar errado??? Valeu

Fabio Mauricio

[size="11"][color="red"]* Editado: Lembre-se de utilizar BBCode em seus códigos - marcossousa[/color][/size] :joia:

M

Opa,

Bem acho que tua classe pode estar implementando o padrão Singleton, pelo código que você passou, neste caso sugiro então que não feche as conexões, feche apenas os preparedStatements, e resultsets. Mas cuidado, isto pode complicar bastante e dar uns famosos timeouts quando aumenta o número de usuários no sistema se não tiver um controle muito bem organizado disso aí.

O que você acha desta idéia:

public String conectar() throws NamingException 
      { 
         Connection conn = null; 
         try 
         { 
            Context initCtx = new InitialContext(); 
            Context envCtx = (Context)initCtx.lookup("java:comp/env"); 
            DataSource ds = (DataSource)envCtx.lookup("jdbc/teste"); 
          
              if (ds != null) { 
               conn = ds.getConnection(); 
              } 
    
         } 
         catch(NamingException e) 
         { 
            e.printTrackTrace(); 
         } 
         catch(SQLException e) 
         { 
            e.printTrackTrace(); 
         } 
         return conn; 
      }

Neste caso você terá que fechar a conexão ao final de cada operação.

:okok:

F

Olá Marcos…

Eu ja tentei fazer esse primeiro esquema que vc falou… mais ai o erro que dá e “limite de conexões excedidos para não usuarios”… Quanto ao 2 metodo eu tenho que ver porque eu utilizo tudo dentro de um DAO (inserção/alteração/consulta e exclusão) e meu connection “fconn” esta declarado pra toda a classe… Eu vi nas minhas pesquisas que eu teria que fazer um controle sobre as conexões pra que cada sessão pega-se a sua … Isso procede???

Obrigado…

Fabio Mauricio

Criado 16 de maio de 2006
Ultima resposta 16 de mai. de 2006
Respostas 4
Participantes 2