public class Teste {
public static void main(String[] args) throws Exception {
Class.forName("org.postgresql.Driver");
Statement stmt = null;
Connection conn = null;
ResultSet rs = null;
try {
try {
conn = DriverManager.getConnection("jdbc:postgresql:base", "Rafael U. C. Afonso", "");
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM cliente");
} finally {
conn.close();
}
while(rs.next()) {
System.out.println(rs.getInt(1) + "-" + rs.getString(2));
}
} finally {
stmt.close();
rs.close();
}
}
}
Como podem ver, estou fechando a conexão antes de pegar os resultados do ResultSet. O programa roda normalmente. Se eu colocar stmt.close() dentro do primeiro finally, uma exceção é disparada.
:?: A minha dúvida é: Isto está certo? Se não, por quê? Me convençam que isto está errado.
não é não, o resultset não é um cursos em memoria, até por isto, que cada driver tem uma implementação de ResultSet
ele vai fazendo o fetch do banco a cada next (bom, isto depende de configurações, mas a ideia é esta)
Urubatan: De fato pensei melhor e também acho que isso deve depender da implementação de cada driver. Mesmo se estes drivers forem para o mesmo BD.
Welington: Já estou usando um método parecido com o seu no meu projeto.
Eu gostaria de ter um jeito de me livrar das classes que não vou usar mais (como o Connection e o Statement) depois de executar a query para otimizar recursos. Entretanto parece que vou ter que carregar o trio Connection-PrepaedStatement-ResultSet até o fim da minha transação. Como dizem, a otimização precoce é a raiz de todo o mal.