Boas práticas em JDBC

10 respostas
andre_a_s

Senhores :D
A muito tempo trabalho com sistemas que exigem persistência em banco de dados. Acho que 90% dos casos para todos aqui são assim.
Com a evolução de frameworks como Hibernate, iBatis e servidores de aplicações que criam pools de conexão e outras facilidades, acabamos "perdendo" um pouco da manha de se fazer um código bom e eficaz para persistências sem ajuda de frameworks.
Estou em um projeto simples, é um robô que simula a nevegação de uma app de mainframe. A cada "navegada" ele salva alguns dados no oracle.
Tenho a seguinte classe:

public class OracleConnection {

	private static Connection connection;
	
	public static Connection getConection(){
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@//10.20.1.8:1521/teste";
			String user = "userr";
			String password = "123";
			
			if(connection == null){
				connection = DriverManager.getConnection(url, user, password);	
			}
			
			return connection;
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
			
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
		
	}
	
}

Essa classe nada mais é do que um singleton para o objeto Connection. Tudo funciona, porém, recebi uma exception, cerca de 2 horas depois de estar rodando continuo.

SQLException: connecion is closed.

Depois dessa exception, inseri o seguinte na classe:

if(connection.isClosed()){
	connection = null;
	connection = DriverManager.getConnection(url, user, password);
}

Segundo o DBA, o problema era do banco(estava instavel).
Mas ficou a dúvida... a classe simples que fiz, é confiável? O fato de eu não estar fechando nunca a conexão, é um problema? Singleton pode atrapalhar em algo nesse caso?
A conexão é usada apenas para se fazer um select e um update.

10 Respostas

finotti

Eu considero essa classe "confiável" sim.
Se sua dúvida é em relação a segurança, sugiro recuperar os parâmetros da conexão de um arquivo Properties.

Quanto à fechar a conexão:

Quando utilizo JDBC, crio uma classe de conexão que possui dois métodos estáticos.
getConexao() e fechaConexao().
no método fechaConexao() eu fecho a conexao, o resultset e o preparedStatement.
Mas isso é feito nas classe DAO.

Exemplo:
public void excluir(Long id) throws SQLException {
		try {
			Connection con = Conexao.getConexao();
			pstmt = con.prepareStatement(SQL_EXCLUIR);
			pstmt.setLong(1, id.longValue());
			pstmt.execute();
		
		} catch (SQLException sqlEx) {
			sqlEx.printStackTrace();
			
		} finally {
			Conexao.fechaConexao(con, pstmt, rs);
		}		
	}
andre_a_s

Entendi… mas o fato de eu fechar a conexao e abrir ela N vezes, pode dar um overhead no banco.
A minha app, executa 2 registros por minuto, em média, e cada registro faz 1 select e 3 updates.
Essa app ira rodar em 10 maquinas, entao seriam 80 conexoes que serão requisitadas no oracle por minuto, isso pode dar overhead no banco, certo?
Por isso optei por deixar a conexão aberta, mas tenho duvidas se isso pode me causar algum problema. :roll:

T

Sua aplicação roda continuamente (à noite também)?
Normalmente se uma conexão fica aberta durante muito tempo, ela cai sozinha, e você deve estar preparado para reabri-la.

plentz

Primeira regra básica para JDBC: evite-o ao máximo.

F

Por quê?

plentz

Basicamente porque trabalhar com JDBC é, na maior parte dos casos, menos produtivo que usar um framework de ORM como o Hibernate.

fabim

tente evitá-lo qdo vc e contratado para trabalhar num sistema grande, onde a persistencia já e feita 100% com jdbc e vc nao pode nem pensar em migrar…

nem sempre da pra usar o melhor

plentz

tente evitá-lo qdo vc e contratado para trabalhar num sistema grande, onde a persistencia já e feita 100% com jdbc e vc nao pode nem pensar em migrar…

nem sempre da pra usar o melhor

evitar != nunca usar :wink:

Zeed01

Todos aqui vivem no mundo azul, né ?
Que beleza…

dreamspeaker

Pra quem está aprendendo, eu acho legal usar JDBC.
Começando algo do zero, tudo bem evitar, em quase todos os casos.
Agora pegando trampo no meio do caminho, é dificil fugir.

Quanto ao post, vc vai ter apenas uma conexão aberta?

Criado 13 de abril de 2007
Ultima resposta 26 de abr. de 2007
Respostas 10
Participantes 8