terça-feira, 17 de junho de 2008

PreparedStatements com cláusulas IN

Antes da febre dos frameworks de mapeamento objeto / tabela, era muito comum no mundo Java escrever classes DAO. Você escrevia dentro dela todo o SQL, fazia vários tipos de malabarismos com a conexão e deixava toda parte suja lá dentro. Uma coisa que eu fazia muito era SQL dinâmico. Na época não parava para pensar em uma solução melhor, mas já sabia dos problemas:
  • Encontrar o trecho que gerou o SQL
  • Pooling de Statements
Apesar do driver do Postgres JDBC não fazer pooling de Statements, alguns Pools de conexões fazem.

Voltando ao problema inicial, imagine uma lista de empresas, selecionamos várias empresas para atualizar um campo. Por baixo dos panos estamos criando uma lista (java.util.List provavelmente) e passando isso como parâmetro para o método correto do DAO. Dentro do DAO tem um loop que gera algo como isso: where id_empresa in (?, ?, ?, ?). Toda vez que o número de parâmetros muda, lá se vai o cache caso existir. Pela internet já encontrei várias soluções, algumas muito toscas como fazer vários métodos com um número pré-determinado, mas uma que me agradou (infelizmente eu perdi o link) era enviar apenas 1 parâmetro. Como? Esse parâmetro é para uma função: id_empresa in (string2arr(?)).

Achei a idéia bem interessante e caso não sua aplição deixe fazer isso, sugiro usar nativamente arrays: id_empresa = ANY (?). Não é tão compatível e ainda será necessário implementar a classe, mas acho que vale a pena essa solução.

1 comentários:

Marcel Augusto disse...

Boa Zé....
Ainda terei 25% do seu conhecimento em Postgres (nas coisas que não estão no manual) rsrsrsrs