CTE Based Bulk Strategy para Hibernate e Postgresql

Quem utiliza Hibernate e possui entidades em hierarquia já percebeu que ao realizar Update ou Delete o Hibernate cria tabelas temporárias para gerenciar os IDs que deve alterar em toda a hierarquia. Isso porque por padrão o Hibernate utiliza Temporary Table Bulk Strategy.

O problema dele fazer isso é que quando existe um processo massivo realizando esses updates/deletes uma concorrência muito grande é gerada nas tabelas do Postgresql, pois cada vez que uma tabela temporária é criada ou removida ele escreve nas tabelas de controle que a tabela e seus campos foram incluídos ou removidos.

Deparado com esse problema a solução foi criar uma estratégia própria para o Hibernate para que deixe de usar tabelas temporárias. A solução para deixar de usar as temp tables veio do meu amigo e DBA Guedes que sugeriu usar CTE do Postgresql para criar uma nova bulk strategy.

O resultado foi muito bom. Conseguimos uma redução de tempo de execução e ainda deixamos de gerar concorrência nas tabelas de sistema.

Segue um exemplo do sql gerado com a estratégia:

WITH ht_person ( doc_number ) as ( values (?), (?), (?), (?) ) UPDATE public.person SET name = 'Evandro', birth = '1987-11-26' WHERE ( doc_number ) IN ( SELECT doc_number FROM ht_person );

Você pode encontrar o código no meu GitHub:

https://github.com/epiresdasilva/cte-multi-table-bulk-id-stategy

Para usar é muito simples. Basta clonar o projeto e gerar o JAR usando o comando mvn package.
Feito isso adicione o JAR no seu classpath e adicione a seguinte instrução no seu hibernate.cfg.xml:

<property name="hibernate.hql.bulk_id_strategy">br.com.evandropires.hibernate.ctestrategy.CTEMultiTableBulkIdStrategy</property>

Agora você já estará usando uma bulk strategy que utiliza CTE ao invés de Tabela Temporária.

:)

Deixe uma resposta