É errado ter mais de 2 conexões abertas ao mesmo tempo com o bd?

6 respostas
r-ngarcia

Olá pessoal,

Estou querendo tirar uma dúvida, estou fazendo um acesso ao banco de dados Oracle através de uma classe de persistencia e uma classe de conexão que retorna um objeto do tipo Connection.

Persistência: Onde estão implementados os métodos de CRUD;
OracleConector: Classe que retorna a minha conexão.

Até aí tudo bem, funciona tudo perfeitamente. Mas eu queria saber se o que estou fazendo é correto.
Tenho uma classe chamada Operacao que faz a chamada para a Persistencia e passa um objeto para fazer uma inclusão no banco.

Na minha classe de Operacao tenho a seguinte operacao:

Persistencia per = new Persistencia();

vReturn  = per.createUser(usuario);

o createUser da classe persistencia inclui os atributos do objeto usuario no banco e depois fecha a conexão.

Mas no metodo createUser da classe persistencia eu faço uma verificação para saber se o usuário já existe no banco em getIdUsuario. Ou seja abre um conexão dentro de uma conexão connectception. HUSHAUHS.

public String createUser(Usuario pUsuario) throws SQLException{
		Connection conexao = null;
		CallableStatement cs = null;
		
		try{
		   conexao = new OracleConector().getConnection();
		   ////// AQUI FAZ OUTRA VERIFCAÇÃO NO BANCO
		   int idUsuario = getIdUsuario(pUsuario.getLoginName());
		   //Se não existir esse usuario na base, permite criar
		   if(idUsuario == -1){
			      cs = conexao.prepareCall("{call PCK_INTEGRACAO.P_ADD_USER(?,?,?,?,?,?)}");
			      cs.setString(1, pUsuario.getLoginName()); //UserName
			      cs.setString(2, pUsuario.getPassword());  //Senha
			      cs.setInt   (3, pUsuario.getIdEmpresa()); //Empresa
			      cs.setString(4, "");                      //CdPerfilUsuario
			      cs.setString(5, pUsuario.getEmail());     //Email
			      cs.setString(6, pUsuario.getFirstName() + " " + pUsuario.getLastName());//NomeUsuario
			      cs.executeUpdate();
			      System.out.println("[SUCESSO]: Usuário incluido com sucesso!");
			      return "Usuario incluido com sucesso!"; 
		   }else{
				   System.out.println("[FALHA]: Já existe um usuário com essa identificação!");
				   return "Já existe um usuario com essa identificação";
		   }
		}catch(SQLException e){
			 System.out.println("Erro: " + e);
			 System.out.println("[FALHA]: Não foi possível incluir o usuario.");	
			 return "Erro: " + e;
		}finally{
			conexao.close();
			System.out.println("***Conexão com o oracle fechada!***");
		}
	}

Ou seja eu faço uma verificação no banco abrindo uma nova conexão com o oracle dentro de um método onde a conexão já está aberta. Ou seja são criada duas conexões. Fiz dessa forma para o código ficar bem reutilizavel e não precisar a repetição do mesmo.
Conclusão. Posso ter duas conexões ao mesmo tempo aberta com o banco de dados? ou isso foge das boas práticas?

Lembrando que no final as duas são fechadas.

Obrigado desde já.

6 Respostas

ssh

se no seu método getIdUsuario() contem conexao.close(). é só você chamar o getIdUsuario, antes de instanciar essa nova conexao.

mas o oracle é sem dúvida o melhor sgbd da atualidade na minha opnião, e faz um ótimo trabalho com a gerencia de concorrencia.

robinsonbsilva

Fala r-ngarcia,

Acredito que o mais correto seria você criar um Singleton da sua conexão.

Veja: http://fazendoti.wordpress.com/2011/06/27/criando-uma-classe-de-conexao-com-singleton/

Boa sorte.

rmendes08

r-ngarcia:
Olá pessoal,

Estou querendo tirar uma dúvida, estou fazendo um acesso ao banco de dados Oracle através de uma classe de persistencia e uma classe de conexão que retorna um objeto do tipo Connection.

Persistência: Onde estão implementados os métodos de CRUD;
OracleConector: Classe que retorna a minha conexão.

Até aí tudo bem, funciona tudo perfeitamente. Mas eu queria saber se o que estou fazendo é correto.
Tenho uma classe chamada Operacao que faz a chamada para a Persistencia e passa um objeto para fazer uma inclusão no banco.

Na minha classe de Operacao tenho a seguinte operacao:

Persistencia per = new Persistencia();

vReturn  = per.createUser(usuario);

o createUser da classe persistencia inclui os atributos do objeto usuario no banco e depois fecha a conexão.

Mas no metodo createUser da classe persistencia eu faço uma verificação para saber se o usuário já existe no banco em getIdUsuario. Ou seja abre um conexão dentro de uma conexão connectception. HUSHAUHS.

public String createUser(Usuario pUsuario) throws SQLException{
		Connection conexao = null;
		CallableStatement cs = null;
		
		try{
		   conexao = new OracleConector().getConnection();
		   ////// AQUI FAZ OUTRA VERIFCAÇÃO NO BANCO
		   int idUsuario = getIdUsuario(pUsuario.getLoginName());
		   //Se não existir esse usuario na base, permite criar
		   if(idUsuario == -1){
			      cs = conexao.prepareCall("{call PCK_INTEGRACAO.P_ADD_USER(?,?,?,?,?,?)}");
			      cs.setString(1, pUsuario.getLoginName()); //UserName
			      cs.setString(2, pUsuario.getPassword());  //Senha
			      cs.setInt   (3, pUsuario.getIdEmpresa()); //Empresa
			      cs.setString(4, "");                      //CdPerfilUsuario
			      cs.setString(5, pUsuario.getEmail());     //Email
			      cs.setString(6, pUsuario.getFirstName() + " " + pUsuario.getLastName());//NomeUsuario
			      cs.executeUpdate();
			      System.out.println("[SUCESSO]: Usuário incluido com sucesso!");
			      return "Usuario incluido com sucesso!"; 
		   }else{
				   System.out.println("[FALHA]: Já existe um usuário com essa identificação!");
				   return "Já existe um usuario com essa identificação";
		   }
		}catch(SQLException e){
			 System.out.println("Erro: " + e);
			 System.out.println("[FALHA]: Não foi possível incluir o usuario.");	
			 return "Erro: " + e;
		}finally{
			conexao.close();
			System.out.println("***Conexão com o oracle fechada!***");
		}
	}

Ou seja eu faço uma verificação no banco abrindo uma nova conexão com o oracle dentro de um método onde a conexão já está aberta. Ou seja são criada duas conexões. Fiz dessa forma para o código ficar bem reutilizavel e não precisar a repetição do mesmo.
Conclusão. Posso ter duas conexões ao mesmo tempo aberta com o banco de dados? ou isso foge das boas práticas?

Lembrando que no final as duas são fechadas.

Obrigado desde já.

Bom, esse é aquele tipo de pergunta cuja resposta é: DEPENDE.

É errado manter mais de uma conexão com o banco de dados ? Não. Tanto não é errado que existem os famosos pool’s de conexões, ou seja, você cria uma camada na sua aplicação que cuida somente de abrir e fechar conexões com o banco de dados. Assim, uma conexão pode até mesmo ser reaproveitada em várias ocasiões.

Então, posso abrir uma nova conexão sempre que precisar ? Também não, afinal de contas conexões são recursos limitados, e se o número de conexões for alto, você pode ficar sem conexões ou ter sérios problemas de desempenho.

Na prática, a gerência de conexões é feita através de um pool. Por exemplo, ao iniciar a aplicação, o pool cria 5 conexões “logo de cara”. À medida que a aplicação precisa, o pool aloca e recebe de volta essas conexões. Se um dados momento a aplicação precisar de mais de 5 conexões, ela pode criar novas conexões até um limite máximo, por exemplo, 30 conexões; Por sua vez, conforme as conexões vai deixando de ser usadas o pool vai fechando as conexões até seu número mínimo novamente, entendeu ?

rmendes08

robinsonbsilva:
Fala r-ngarcia,

Acredito que o mais correto seria você criar um Singleton da sua conexão.

Veja: http://fazendoti.wordpress.com/2011/06/27/criando-uma-classe-de-conexao-com-singleton/

Boa sorte.

Não necessariamente. Se a aplicação rodar com mais de uma thread ou o desempenho vai pro saco ou você tem erros de concorrência.

r-ngarcia

ssh:
se no seu método getIdUsuario() contem conexao.close(). é só você chamar o getIdUsuario, antes de instanciar essa nova conexao.

mas o oracle é sem dúvida o melhor sgbd da atualidade na minha opnião, e faz um ótimo trabalho com a gerencia de concorrencia.

Valeu ssh, eu pensei em fazer isso também, é que como era um processo referente a inclusão de um usuario achei que seria melhor centralizar na próprio método de inclusão. Mas a curto prazo acho que vou fazer dessa forma mesmo. Valeu.

Fala r-ngarcia,

Acredito que o mais correto seria você criar um Singleton da sua conexão.

Veja: http://fazendoti.wordpress.com/2011/06/27/criando-...asse-de-conexao-com-singleton/

Boa sorte.

Opa, valeu cara, então na verdade a aplicação que estou fazendo é um webservice, mas a longo prazo eu gostei da idéia. Sabe se tem alguma advertência em usar SingleTon com webservice?

Bom, esse é aquele tipo de pergunta cuja resposta é: DEPENDE.

É errado manter mais de uma conexão com o banco de dados ? Não. Tanto não é errado que existem os famosos pool’s de conexões, ou seja, você cria uma camada na sua aplicação que cuida somente de abrir e fechar conexões com o banco de dados. Assim, uma conexão pode até mesmo ser reaproveitada em várias ocasiões.

Então, posso abrir uma nova conexão sempre que precisar ? Também não, afinal de contas conexões são recursos limitados, e se o número de conexões for alto, você pode ficar sem conexões ou ter sérios problemas de desempenho.

Na prática, a gerência de conexões é feita através de um pool. Por exemplo, ao iniciar a aplicação, o pool cria 5 conexões “logo de cara”. À medida que a aplicação precisa, o pool aloca e recebe de volta essas conexões. Se um dados momento a aplicação precisar de mais de 5 conexões, ela pode criar novas conexões até um limite máximo, por exemplo, 30 conexões; Por sua vez, conforme as conexões vai deixando de ser usadas o pool vai fechando as conexões até seu número mínimo novamente, entendeu ?

Opa, valeu pelo esclarecimento Rmendes08.
Mas então você acha que abrir uma conexão a cada operação é errado? tipo.
Abre conexão > Insere Usuario > Fecha Conexão; Abre conexão > Insere Empresa > Fecha Conexão.

Não de forma simultanea, mas sequencial, tem problema isso?

Abraços. Valeu pela ajuda

felipeguerra

Fuja do Singleton…

Criado 1 de novembro de 2012
Ultima resposta 1 de nov. de 2012
Respostas 6
Participantes 5