Estou ficando um pouco confuso, eu estava lendo o abaixo em http://en.wikipedia.org/wiki/Java_Database_Connectivity
Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor",
"myLogin",
"myPassword" );
Statement stmt = conn.createStatement();
try {
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
} finally {
//It's important to close the statement when you are done with it
stmt.close();
}
Você não precisa fechar a conexão conn? O que realmente está acontecendo se o conn.close () não ocorrer?
Eu tenho um aplicativo Web privado que estou mantendo que atualmente não fecha nenhum dos formulários, mas o importante é realmente o stmt, o conn ou ambos?
O site continua inoperante de forma intermitente, mas o servidor continua dizendo que é um problema de conexão com o banco de dados. Suspeito que não esteja sendo fechado, mas não sei qual fechar.
java
database-connection
onaclov2000
fonte
fonte
Respostas:
Quando você terminar de usar o seu
Connection
, precisará fechá-lo explicitamente chamando seuclose()
método para liberar quaisquer outros recursos do banco de dados (cursores, identificadores, etc.) nos quais a conexão esteja mantendo.Na verdade, o padrão seguro em Java é encerrar a sua
ResultSet
,Statement
eConnection
(nessa ordem) em umfinally
bloco quando você está feito com eles, algo assim:O
finally
bloco pode ser ligeiramente aprimorado para (para evitar a verificação nula):Mas, ainda assim, isso é extremamente detalhado, geralmente você acaba usando uma classe auxiliar para fechar os objetos nos métodos auxiliares com segurança nula e o
finally
bloco se torna algo assim:E, na verdade, o Apache Commons DbUtils tem uma
DbUtils
classe que está fazendo exatamente isso, portanto não há necessidade de escrever sua própria.fonte
rs
,ps
,conn
pode sernull
, dependendo de onde as quebras de código. É por isso que isso é conhecido como padrão "seguro".close
método de umStatement
objeto fecha automaticamente o associadoResultSet
se a instrução tiver um conjunto de resultados aberto. Da mesma forma, oclose
método daConnection
classe fecha todosStatements
osConnection
.É sempre melhor fechar os objetos de banco de dados / recurso após o uso. Melhor fechar objetos de conexão, conjunto de resultados e instrução no
finally
bloco.Até o Java7, todos esses recursos precisam ser fechados usando um
finally
bloco. Se você estiver usando o Java 7, para fechar os recursos, você pode fazer o seguinte.Agora, os objetos con, stmt e rs se tornam parte do bloco try e o java fecha automaticamente esses recursos após o uso.
Espero ter sido útil.
fonte
ResultSet rs = conn.createStatement().executeQuery(sql);
dentro dotry
bloco?É suficiente fechar apenas
Statement
eConnection
. Não há necessidade de fechar explicitamente oResultSet
objeto.A documentação Java diz sobre
java.sql.ResultSet
:Obrigado BalusC pelos comentários: "Eu não confiaria nisso. Alguns drivers JDBC falham nisso."
fonte
Sim. Você precisa fechar o conjunto de resultados, a instrução e a conexão. Se a conexão veio de um pool, o fechamento realmente o envia de volta ao pool para reutilização.
Você normalmente precisa fazer isso em um
finally{}
bloco, de modo que, se uma exceção for lançada, você ainda terá a chance de fechá-la.Muitas estruturas cuidam desse problema de alocação / desalocação de recursos para você. por exemplo, o JdbcTemplate do Spring . O Apache DbUtils possui métodos para cuidar do fechamento do conjunto de resultados / instrução / conexão, nulo ou não (e captura de exceções ao fechar), o que também pode ajudar.
fonte
Na verdade, é melhor se você usar um bloco try-with-resources e o Java fechará todas as conexões quando você sair do bloco try.
Você deve fazer isso com qualquer objeto que implemente o AutoClosable.
A chamada para getDatabaseConnection é apenas composta. Substitua-o por uma chamada que obtenha uma conexão JDBC SQL ou uma conexão de um pool.
fonte
Sim, você precisa fechar a conexão. Caso contrário, o cliente de banco de dados normalmente manterá a conexão do soquete e outros recursos abertos.
fonte