Dúvida cruel sobre Statement

Pessoal,

Estou com a seguinte dúvida,

O que é melhor fazer com o Statement ?

  • Criar um atributo e usar em todos métodos;

  • Criar um Statement para cada método;

  • Receber um Statement com parâmetro do método.

A forma clássica de utilizá-lo é dentro de cada método. Observe:

public void update(final String value) {
    Connection con = null;
    PreparedStatement stmt = null;
    try {
        final String sql = "UPDATE users SET NAME = ?";
        con = getConnection();
        stmt = con.prepareStatement(sql);
        stmt.setString(value);
        stmt.execute();
    } catch (Exception e) { /* //TODO */ } finally {
        if (stmt != null) stmt.close();
        if (con != null) con.close();
    }
}

No caso específico dos Prepared, veja o comentário no java doc da Sun:

Então, se tu tens casos em que dentro de um método tu precisas executar uma instrução mais de uma vez e tens dentro deste mesmo método uma chamada a outro método que compartilha a mesma instância de PreparedStatement, podes ter problemas e criar um estado de inconsistência no objeto (a menos que no retorno da chamada tu refaça novamente o objeto - no fim das contas não compensa criar cada método o seu?!). Caso não haja dependência entre métodos que compartilhem esta mesma instância, a princípio não acho impacto negativo.

Há também as questões relacionadas a transação (commit e rollback). Não posso aviar isto sem testar, mas é algo a se pensar. T+

Opa,

eu vejo como uma melhor solução cada método ter o teu próximo preparedStatement ou Statement, porque é muito interessante que você abra e fecha o ResultSet, Statement, e a Connection ao terminar de comunicar com o banco de dados.

Isto pode evitar que no futuro você não encontre problemas com timout de conexões entre outros problemas.

:okok: