Pessoal é o seguinte, estou dando manutenção em um sistema e detectei o seguinte problema:
tenho um método que faz um update em uma tabela que contém 8 milhões de registros, e se seguir o padrão recomando do PreparedStatement o processo demora cerca de 5 minutos.
Connection con = bancoDados.abrirConexao();
String sql = "UPDATE transacao SET login = ?, data=?, numeroip = ? , tipotrans = ? , hora = ? WHERE numero = ? ";
PreparedStatement pst = con.prepareStatement(sql);
try {
pst.setString(1, "ADMIN");
pst.setTimestamp(2, new java.sql.Timestamp(new java.util.Date().getTime()));
pst.setString(3, "127.0.0.1");
pst.setString(4,"800000");
pst.setTimestamp(5, new java.sql.Timestamp(new java.util.Date().getTime()));
pst.setString(6, "723054");
pst.executeUpdate();
pst.close();
System.out.println("Atualizado!");
} catch (Exception e) {
System.out.println("Erro!");
throw new Exception("Nao foi possivel salvar transacao: " + e.getMessage());
}
essa execução está demorando em torno de 5 minutos para ser processado, porém descobri que se eu tirar a linha pst.setString(6, “723054”); e adicionar o valor direto na query, a execução é feita em 1 segundo.
Agora pergunto eu. O porquê disso? acredito que seja bug do driver JDBC pois não encontrei nada sobre isso. E acredito que do jeito que está, é o padrão recomendado (tirando o número ser String em outras coisas)…
Se alguém tiver alguma idéia…
OBS: O banco de dados é o postgres.
Grato,
Atenciosamente,
