domingo, 7 de abril de 2013

Geração de Log e Auditoria de dados usando (Hibernate Envers)


A maioria das aplicações de médio e grande porte necessita de geração de Log´s e Auditoria, sempre foi um requisito não funcional para auditar dados sigilosos e importantes. Com a necessidade surgiu a framework que ajuda na construção desses dados auditados (Hibernate Envers), onde neste artigo irei explicar como utiliza-lo.
Usaremos a versão do Hibernate Envers 1.2.2 (compatível com o hibernate 3.3.X), não é uma versão final, e utilizar o JBOSS 5.0.1 GA como servidor e JPA 2. Lembrando que devemos acrescentar o JAR do hibernate envers no JBOSS para funcionar a aplicação.

Configurando o Hibernate Envers


Para cada entidade que deve ser auditada (gerada um log), devemos utilizar a annotation @Audited, nesta anotação você deixa explicito que a entidade X deve ser auditada a cada execução de insert, update e delete, mas falta algo para na configuração que deixa explícitos quais operações a entidade deve ser log, temos a configuração no persistence.xml, segue abaixo:

<property name="hibernate.ejb.event.post-insert" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-update" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-delete" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-update" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-remove" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-collection-recreate" value="org.hibernate.envers.event.AuditEventListener" />

Está configuração serve para dizer as operações que Envers irá executar para cada entidade anotada.
Sim é uma situação muito simples de configurar e anotar as entidades, mas deve lembrar que analisar e arquitetar as entidades e verificar que aqueles dados sim são importantes e devem ser auditados, pois nem todos os dados devem ser auditados e pode sim atrapalhar o consumo de dados no banco.

Que ganho tem na minha aplicação


Simples, quando geramos trigger para gerar essas auditorias sempre temos que disparar um gatilho no banco, além de consumir um recurso do banco temos esse GAP para disparo, na aplicação Java o momento de utilização das seguintes operações update, delete e insert é o momento que o Envers irá executar, então estaremos utilizando o mesmo consumo e recurso é como se estivéssemos gravando juntamente com cada operação do banco.

Mas a aplicação pode ficar sobrecarregada


Não, pois a própria framework cuida disso, este problema já havia sido levado em consideração e devemos utilizar entidade apenas para auditoria para que não utilize o mesmo recurso da sessão do JPA e ou Hibernate. Como sabemos ele abre Threads para cada transação, utilizando sempre a mesma conexão, para que não gere concorrência e gere um gargalo da aplicação. Então irá consumir ou sobrecarregar a aplicação? Não.

Como consultar


O Envers possui um processo de Criteria do Hibernate, com os métodos AuditReader e o AuditQuery. O primeiro é para consultas e retorno de dados e o segundo é para construção de query´s mais pesadas.
Vale lembrar que as consultas que possua entidades com listas, todas elas você deverá percorrer, pois o Envers trata os @ManytoMany e @ManytoOne como FetchType como Lazy, caso na consulta você não deixe explicito que necessita que aquele objeto deve ser carregado, irá trazer uma lista não concluída, no momento de acessa-lo irá estourar um erro do próprio Hibernate.

Exemplo de entidade anotada


@Entity
@Audited //Anotação da entidade dizendo que esta devera ser auditada
public class Pessoa {

}

Conclusão


Podemos ter auditoria de dados e logs acoplado no Java, vimos que temos um recurso Java que não consome tanto recurso do banco e que é certamente seguro.

Qualquer dúvida só entrar em contato.

Referencias:

Nenhum comentário:

Postar um comentário