SlideShare uma empresa Scribd logo
HIBERNATE
                                       ENVERS


       SOLUÇÃO PARA AUDITORIA DE OBJETOS PERSISTENTES




terça-feira, 21 de fevereiro de 12
AGENDA
• INTRODUÇÃO

• ESTRUTURA

• POR              QUE ARMAZENAR RASTRO ?

• EXEMPLO                            BÁSICO

• NECESSIDADE ATUAL                            (SPO)




terça-feira, 21 de fevereiro de 12
INTRODUÇÃO


    •O           QUE É O ENVERS

    • COMO                           SURGIU

    • COMO                           ELE ESTÁ

    • COMO                           ELE PODE NOS AJUDAR



terça-feira, 21 de fevereiro de 12
POR ARMAZENAR RASTRO?




terça-feira, 21 de fevereiro de 12
O PROBLEMA



    • Armazenar                      log em um ambiente distribuído e centrlizado




terça-feira, 21 de fevereiro de 12
CAUSAS



    • Latência                       extrema na execução de transações.

          • Marshall                  e Unmarshall de objetos




terça-feira, 21 de fevereiro de 12
SOLUÇÕES



    • ????????????????




terça-feira, 21 de fevereiro de 12
O BÁSICO
                                      POREM, FUNCIONAL




terça-feira, 21 de fevereiro de 12
MODELO ESTRUTURAL


                                                     ENVERS



                                     ANNOTATION
                                        @Audited
                                      @RevisionEntity
                                      RevisionListener
terça-feira, 21 de fevereiro de 12
EXEMPLOS




terça-feira, 21 de fevereiro de 12
EXEMPLOS
                                                                                 @Entity
  @Entity                                                                        @RevisionEntity(EnversRevisionListener.class)
  @Table(name = "ecm_address") //renomeado para suportar a mudanca no ER         @Table(name = "ecm_login_rev_entity")
  @AttributeOverride(name = "id", column = @Column(name = "addressId"))          public class LoginRevEntity {
  @Audited                                                                       	
  public class Address extends AbstractEntity {                                  	    @Id
                                                                                 	    @GeneratedValue(strategy = GenerationType.IDENTITY)
  	       private   String rua;                                                  	    @RevisionNumber
  	       private   String bairro;                                               	    private Long id;
  	       private   String CEP;                                                  	
  	       private   String complemento;                                          	    private String usuario;
  	       private   String pontoReferencia;                                      	
  	       private   Boolean entrega;                                             	    @RevisionTimestamp
                                                                                 	    private long timestamp;



      public class EnversRevisionListener implements RevisionListener {

      	    @Override
      	    public void newRevision(Object revisionEntity) {
      	    	    Map<String,Object> session = ActionContext.getContext().getSession();
      	    	
      	    	    if(session != null) {
      	    	    	      ApplicationUserElementSession userSession = (ApplicationUserElementSession) session.get(Constants.APPLICATION_USER_SESSION);
      	    	    	      LoginRevEntity exampleRevEntity = (LoginRevEntity) revisionEntity;
      	    	         exampleRevEntity.setTimestamp(new Date().getTime());
      	    	         if(userSession != null) {
      	    	         	 User userAutenticated = userSession.getUserAutenticate();
      	    	         	 exampleRevEntity.setUsuario(userAutenticated.getLogin());
      	    	         }
      	    	         else {
      	    	         	 exampleRevEntity.setUsuario("new_user");
      	    	         }
      	    	    }
      	    }
      	
      }



terça-feira, 21 de fevereiro de 12
CONSULTAS
                                     CONCEITO DE REVISÕES




terça-feira, 21 de fevereiro de 12
CONSULTAS
    •    Entidades em revisão

    •    Revisões sobre entidades

    •    Elementos inspirados por consultas com estilos Criteria

    •    Impossibilidade de realizar consultas com recursos JPA

          •    Conhecendo o modelo, podemos utilizar SQL para gerar relatórios

   auditReader.createQuery()
    .forRevisionsOfEntity(Person.class, false, true)
    .addProjection(AuditEntity.revisionNumber().count())
    .add(AuditEntity.id().eq(person.getId()))
    .getSingleResult()

terça-feira, 21 de fevereiro de 12
NA
                                     PRÁTICA



terça-feira, 21 de fevereiro de 12
Performance
           DESEMPENHO
        Must be slower than without auditing:
    •    Um INSERT para cada entidade modificada
           1 insert for each modified entity
    •    Um INSERT para cara transação
           1 insert for each transaction

                             MySQL 5.1.30       5000                1000             5000
                               (InnoDB)        inserts          complex inserts     updates


                                Not audited    6.307s                     6.622s    8.487s



                                     Audited   9.807s                     12.758s   11.444s



                                 Difference    x 1.55                     x 1.92    x 1.34

            42                                           www.devoxx.com


terça-feira, 21 de fevereiro de 12                                                            42
COMO FICARIA NO SPO ??
                       - Interface de administração
                         * Propriedades do sistema
                         * Dados de auditoria




terça-feira, 21 de fevereiro de 12
CONCLUSÕES

    • SOLUÇÕES                       DE AUDITORIA EM BASE DE DADOS LOCAIS

          •+          desempenho

          •+          flexibilidade

          •+          controle

          •-       XML/SOAP



terça-feira, 21 de fevereiro de 12
REFERÊNCIAS


    •    JBoss Comunity - Envers Documentation: http://www.jboss.org/envers

    •    Adam Warski Blog - Criador do Envers: http://www.warski.org/blog/

    •    Textos explicativos: www.nelsonalone.com.br




terça-feira, 21 de fevereiro de 12

Mais conteúdo relacionado

PPTX
Basesdedados
PPTX
Treinamento de SQL Básico
PPT
重庆KDU百乐英语
PDF
Apresentacao Ii Encontro Sl Amazonas Integracao De Frameworks
PDF
2024 Trend Updates: What Really Works In SEO & Content Marketing
PDF
Storytelling For The Web: Integrate Storytelling in your Design Process
PDF
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
PDF
How to Leverage AI to Boost Employee Wellness - Lydia Di Francesco - SocialHR...
Basesdedados
Treinamento de SQL Básico
重庆KDU百乐英语
Apresentacao Ii Encontro Sl Amazonas Integracao De Frameworks
2024 Trend Updates: What Really Works In SEO & Content Marketing
Storytelling For The Web: Integrate Storytelling in your Design Process
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
How to Leverage AI to Boost Employee Wellness - Lydia Di Francesco - SocialHR...

Último (11)

PDF
Manejo integrado de pragas na cultura do algodão
PPTX
Eng. Software - pontos essenciais para o início
PPTX
Tipos de servidor em redes de computador.pptx
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PPTX
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
PPTX
Design - Introdução a Gestalt e teoria das formas
PPTX
Utilizando code blockes por andre backes
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PPTX
Arquitetura de computadores - Memórias Secundárias
Manejo integrado de pragas na cultura do algodão
Eng. Software - pontos essenciais para o início
Tipos de servidor em redes de computador.pptx
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
Viasol Energia Solar -Soluções para geração e economia de energia
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
Design - Introdução a Gestalt e teoria das formas
Utilizando code blockes por andre backes
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Arquitetura de computadores - Memórias Secundárias
Anúncio
Anúncio

Envers

  • 1. HIBERNATE ENVERS SOLUÇÃO PARA AUDITORIA DE OBJETOS PERSISTENTES terça-feira, 21 de fevereiro de 12
  • 2. AGENDA • INTRODUÇÃO • ESTRUTURA • POR QUE ARMAZENAR RASTRO ? • EXEMPLO BÁSICO • NECESSIDADE ATUAL (SPO) terça-feira, 21 de fevereiro de 12
  • 3. INTRODUÇÃO •O QUE É O ENVERS • COMO SURGIU • COMO ELE ESTÁ • COMO ELE PODE NOS AJUDAR terça-feira, 21 de fevereiro de 12
  • 4. POR ARMAZENAR RASTRO? terça-feira, 21 de fevereiro de 12
  • 5. O PROBLEMA • Armazenar log em um ambiente distribuído e centrlizado terça-feira, 21 de fevereiro de 12
  • 6. CAUSAS • Latência extrema na execução de transações. • Marshall e Unmarshall de objetos terça-feira, 21 de fevereiro de 12
  • 7. SOLUÇÕES • ???????????????? terça-feira, 21 de fevereiro de 12
  • 8. O BÁSICO POREM, FUNCIONAL terça-feira, 21 de fevereiro de 12
  • 9. MODELO ESTRUTURAL ENVERS ANNOTATION @Audited @RevisionEntity RevisionListener terça-feira, 21 de fevereiro de 12
  • 10. EXEMPLOS terça-feira, 21 de fevereiro de 12
  • 11. EXEMPLOS @Entity @Entity @RevisionEntity(EnversRevisionListener.class) @Table(name = "ecm_address") //renomeado para suportar a mudanca no ER @Table(name = "ecm_login_rev_entity") @AttributeOverride(name = "id", column = @Column(name = "addressId")) public class LoginRevEntity { @Audited public class Address extends AbstractEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private String rua; @RevisionNumber private String bairro; private Long id; private String CEP; private String complemento; private String usuario; private String pontoReferencia; private Boolean entrega; @RevisionTimestamp private long timestamp; public class EnversRevisionListener implements RevisionListener { @Override public void newRevision(Object revisionEntity) { Map<String,Object> session = ActionContext.getContext().getSession(); if(session != null) { ApplicationUserElementSession userSession = (ApplicationUserElementSession) session.get(Constants.APPLICATION_USER_SESSION); LoginRevEntity exampleRevEntity = (LoginRevEntity) revisionEntity; exampleRevEntity.setTimestamp(new Date().getTime()); if(userSession != null) { User userAutenticated = userSession.getUserAutenticate(); exampleRevEntity.setUsuario(userAutenticated.getLogin()); } else { exampleRevEntity.setUsuario("new_user"); } } } } terça-feira, 21 de fevereiro de 12
  • 12. CONSULTAS CONCEITO DE REVISÕES terça-feira, 21 de fevereiro de 12
  • 13. CONSULTAS • Entidades em revisão • Revisões sobre entidades • Elementos inspirados por consultas com estilos Criteria • Impossibilidade de realizar consultas com recursos JPA • Conhecendo o modelo, podemos utilizar SQL para gerar relatórios auditReader.createQuery() .forRevisionsOfEntity(Person.class, false, true) .addProjection(AuditEntity.revisionNumber().count()) .add(AuditEntity.id().eq(person.getId())) .getSingleResult() terça-feira, 21 de fevereiro de 12
  • 14. NA PRÁTICA terça-feira, 21 de fevereiro de 12
  • 15. Performance DESEMPENHO Must be slower than without auditing: • Um INSERT para cada entidade modificada 1 insert for each modified entity • Um INSERT para cara transação 1 insert for each transaction MySQL 5.1.30 5000 1000 5000 (InnoDB) inserts complex inserts updates Not audited 6.307s 6.622s 8.487s Audited 9.807s 12.758s 11.444s Difference x 1.55 x 1.92 x 1.34 42 www.devoxx.com terça-feira, 21 de fevereiro de 12 42
  • 16. COMO FICARIA NO SPO ?? - Interface de administração * Propriedades do sistema * Dados de auditoria terça-feira, 21 de fevereiro de 12
  • 17. CONCLUSÕES • SOLUÇÕES DE AUDITORIA EM BASE DE DADOS LOCAIS •+ desempenho •+ flexibilidade •+ controle •- XML/SOAP terça-feira, 21 de fevereiro de 12
  • 18. REFERÊNCIAS • JBoss Comunity - Envers Documentation: http://www.jboss.org/envers • Adam Warski Blog - Criador do Envers: http://www.warski.org/blog/ • Textos explicativos: www.nelsonalone.com.br terça-feira, 21 de fevereiro de 12