Nossa seção de código padrão para usar JDBC é ...
Connection conn = getConnection(...);
Statement stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rset = stmt.executeQuery (sqlQuery);
// do stuff with rset
rset.close(); stmt.close(); conn.close();
Pergunta 1: Ao usar o pool de conexões, deve-se fechar a conexão no final? Em caso afirmativo, o objetivo do pool não está perdido? E se não, como o DataSource sabe quando uma determinada instância do Connection é liberada e pode ser reutilizada? Estou um pouco confuso com este, quaisquer dicas serão apreciadas.
Questão 2: o método a seguir está próximo do padrão? Parece uma tentativa de obter uma conexão do pool e, se o DataSource não puder ser estabelecido, use o antigo DriverManager. Não temos certeza de qual parte está sendo executada em tempo de execução. Repetindo a pergunta acima, deve-se fechar a Conexão que sai de tal método?
Obrigado, - MS.
synchronized public Connection getConnection (boolean pooledConnection)
throws SQLException {
if (pooledConnection) {
if (ds == null) {
try {
Context envCtx = (Context)
new InitialContext().lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat");
return ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
}}
return (ds == null) ? getConnection (false) : ds.getConnection();
}
return DriverManager.getConnection(
"jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);
}
Edit: Acho que estamos obtendo a conexão em pool, pois não vemos um rastreamento de pilha.
fonte
getConnection()
é estranho. Basta fazer em c'tor ou bloco de inicialização da mesma classe, sem sincronização / verificação de nulos. Será chamado apenas uma vez. Para mais dicas e exemplos iniciais, você pode achar este artigo útil.close()
todos eles nofinally
bloco do mesmotry
bloco onde você os adquiriu / criou. Isso é completamente independente de ser uma conexão em pool ou não.Os pools normalmente retornam a você um objeto Connection encapsulado, onde o método close () é substituído, normalmente retornando a Connection ao pool. Chamar close () está OK e provavelmente ainda é necessário.
Um método close () provavelmente seria assim:
Para sua segunda pergunta, você pode adicionar um logger para mostrar se o bloco inferior funciona. Eu imagino que você só queira de uma forma ou de outra para a configuração de suas conexões de banco de dados. Usamos apenas um pool para nossos acessos ao banco de dados. De qualquer forma, fechar a conexão seria muito importante para evitar vazamentos.
fonte
Calling close() is OK and probably still required.
, não chamar close irá vazar a conexão, a menos que o pool implemente alguma estratégia de recuperaçãoNa verdade, a melhor abordagem para gerenciamento de conexão é não transferi-los para nenhum código em qualquer lugar.
Crie uma classe SQLExecutor que é o único local que abre e fecha conexões.
O restante do aplicativo, então, bombeia instruções para o executor, em vez de obter conexões do pool e gerenciá-las (ou gerenciá-las incorretamente) em todo o lugar.
Você pode ter quantas instâncias do executor desejar, mas ninguém deve escrever código que abre e fecha conexões em seu próprio nome.
Convenientemente, isso também permite que você registre todo o seu SQL a partir de um único conjunto de código.
fonte