A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Leo Silva Leonardo Murta Luiz Viana Persistência em Java.

Apresentações semelhantes


Apresentação em tema: "Leo Silva Leonardo Murta Luiz Viana Persistência em Java."— Transcrição da apresentação:

1 Leo Silva Leonardo Murta Luiz Viana Persistência em Java

2 Agenda Introdução JDBC JPA (Java Persistence API) O que é JPA?
Provedores de Persistência Hibernate Comparação Prevayler O que é Prevayler? Motivação Snapshot Transações Exemplo Conclusão

3 Introdução O suporte a persistência em Java foi desenvolvido visando simplificar, melhorar e padronizar as aplicações em Java.

4 Introdução Baseia-se nas melhores idéias de tecnologias de persistência como: Hibernate TopLink OpenJPA Eclipselink Um único padrão de persistência, com uma liberdade de escolher a sua implementação

5 JDBC (Java Database Connectivity)
Conjunto de classes e interfaces, que manipula dados persistentes. Conexão com qualquer Banco de Dados relacional. É uma API Java, ou seja, apenas uma especificação. Problemas... – Manutenção – Necessidade de aprendizado de várias APIs • Solução !– Adição de uma nova camada – Abstrai especificidades de comunicação com osbancos

6 JDBC Diferentes bancos de dados possuem diferentes formas de se comunicar com uma aplicação:

7 O que é API? É um conjunto de interfaces implementadas no Driver que garantem a independência da aplicação com o banco de dados utilizado.

8 JDBC – Tipos de Driver Fonte- http://www.argonavis.com.br
Tipo 1: ponte ODBC-JDBC O tipo 1 é um driver de ponte entre Java e ODBC. O driver de ponte mais conhecido é o fornecido pela Sun o JDBC-ODBC bridge. Tipo 2: solução com código nativo Usam uma API nativa. Esses drivers contém métodos Java implementados em C ou C++. Tipo 3: solução 100% Java no cliente O tipo 3 é um driver totalmente Java que se comunica com algum tipo de middleware* que então se comunica com o banco de dados Tipo 4: solução 100% Java O tipo 4 é um driver totalmente Java que vai diretamente ao banco de dados *Middleware ou mediador, no campo de computação distribuída, é um programa de computador que faz a mediação entre softwares e software. É utilizado para mover ou transportar informações e dados entre programas de diferentes protocolos de comunicação, plataformas e dependências do sistema operacional. É geralmente constituído por módulos dotados com APIs de alto nível que proporcionam a sua integração com aplicações desenvolvidas em diversas linguagens de programação e interfaces de baixo nível que permitem a sua independência relativamente ao dispositivo. Seu objetivo é mascarar a heterogeneidade e fornecer um modelo de programação mais produtivo para os programadores de aplicativos. É composto por um conjunto de processos ou objetos em um grupo de computadores, que interagem entre si de forma a implementar comunicação e oferecer suporte para compartilhamento de recursos a aplicativos distribuídos Tipo 1: Ponte JDBC-ODBCÉ o tipo mais simples mas restrito à plataforma Windows . Utiliza ODBC para conectar-se com o banco de dados , convertendo métodos JDBC em chamadas às funções do ODBC. Esta ponte é normalmente usada quando não há um driver puro-Java (tipo 4) para determinado banco de dados , pois seu uso é desencorajado devido à dependência de plataforma. Tipo 2: Driver API-NativoO driver API-Nativo traduz as chamadas JDBC para as chamadas da API cliente do banco de dados usado. Como a Ponte JDBC-ODBC, pode precisar de software extra instalado na máquina cliente. Tipo 3: Driver de Protocolo de RedeTraduz a chamada JDBC para um protocolo de rede independente do banco de dados utilizado, que é traduzido para o protocolo do banco de dados por um servidor. Por utilizar um protocolo independente, pode conectar as aplicações clientes Java a vários bancos de dados diferentes. É o modelo mais flexível. Tipo 4: Driver nativoConverte as chamadas JDBC diretamente no protocolo do banco de dados. Implementado em Java, normalmente é independente de plataforma e escrito pelos próprios desenvolvedores. É o tipo mais recomendado para ser usado. Fonte-

9 JDBC - Driver Carregar Driver JDBC
É preciso carregar a classe do driver na aplicação que irá utilizá-lo. Isto pode ser feito com Class.forName(): Exemplo: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver "); Class.forName(“org.postgresql.Driver");

10 JDBC - Principais classes (pacote java.sql)
DriverManager - gerencia o driver e cria uma conexão com o banco. Connection - é a classe que representa a conexão com o bando de dados. Statement - controla e executa uma instrução SQL. PreparedStatement - controla e executa uma instrução SQL. É melhor que Statement. ResultSet - contém o conjunto de dados retornado por uma consulta SQL. ResultsetMetaData - é a classe que trata dos metadados do banco.

11 JDBC - Vantagens Pode-se escrever um único programa que será capaz de enviar instruções SQL para o banco de dados correto. É uma API independente de SGBD A API para programação do sistema é a mesma para qualquer SGBD, não há necessidade de se desenvolver aplicações voltadas (e amarradas) para um BD específico; Permite a construção de páginas WWW que acessam BD pois dispensa a configuração da máquina cliente Mantém a independência de plataforma da linguagem Java “A aplicação roda em qualquer sistema operacional acessando qualquer BD” !?

12 JDBC - O que faz JDBC lhe dá condições de realizar basicamente três operações: Estabelecer uma conexão com um banco de dados relacional; Enviar instruções SQL; Listar e processar os dados;

13 JPA - Java Persistence API
O que é? Padrão de persistência e mapeamento objeto/relacional Java. Implementado por diversos frameworks de Persistência. Com o sucesso e constante crescimento da linguagem de programação Java, diversas ferramentas (frameworks) de persistências foram surgindo. Diante deste cenário, foi estabelecido em consenso entre os desenvolvedores destes frameworks, um padrão para persistência e mapeamento objeto/relacional, JPA (Java Persistence API). Em sua versão 2.0, adotado e incorporado a documentação Java 317.

14 JPA - Java Persistence API
Características Anotações JPA-QL NamedQuerys POJOs Provedores de Persistência Temos como principais características da especificação: - Utilização de anotações para denotar relacionamento. Linguagem própria, JPA Query Language. NamedQuerys Baseado em POJOS (Beans de Entidade).

15 JPA - Java Persistence API - Hibernate
Framework pioneiro de persistência e mapeamento objeto/relacional. Hibernate 3 Passou a seguir especificação JPA. Arquitetura Interceptor/Callback. Uso de anotações Java 5. HQL Ferramenta gratuita e de código aberto, o Hibernate foi um dos pioneiros no que diz respeito a persistência e mapeamento objeto/relacional em Java. Em sua versão 3, passou a seguir a especificação JPA. Com a arquitetura Interceptor/Callback, pode-se alterar o comportamento antes ou após a realização de uma operação usando ... Para execução de querys, pode-se utilizar SQL puro ou sua linguagem própria, HQL. Com HQL, é possível se valer de facilidades e conceitos de OO, como herança, polimorfismo e encapsulamento.

16 JPA - Java Persistence API - Hibernate
Arquitetura De acordo com a Figura 1, as interfaces são classificadas como: Interfaces responsáveis por executar operações de criação, deleção, consulta e atualização no banco de dados: Session, Transaction e Query; Interface utilizada pela aplicação para configurar o Hibernate: Configuration; Interfaces responsáveis por realizar a interação entre os eventos do Hibernate e a aplicação: Interceptor, Lifecycle e Validatable. Interfaces que permitem a extensão das funcionalidades de mapeamento do Hibernate: UserType, CompositeUserType, IdentifierGenerator. O Hibernate também interage com APIs já existentes do Java: JTA, JNDI e JDBC. De todas as interfaces apresentadas na Figura 1, as principais são: Session, SessionFactory, Transaction, Query, Configuration. Os sub-tópicos seguintes apresentam uma descrição mais detalhada sobre elas. Session (org.hibernate.Session) O objeto Session é aquele que possibilita a comunicação entre a aplicação e a persistência, através de uma conexão JDBC. É um objeto leve de ser criado, não deve ter tempo de vida por toda a aplicação e não é threadsafe. Um objeto Session possui um cache local de objetos recuperados na sessão. Com ele é possível criar, remover, atualizar e recuperar objetos persistentes. SessionFactory (org.hibernate.SessionFactory) O objeto SessionFactory é aquele que mantém o mapeamento objeto relacional em memória. Permite a criação de objetos Session, a partir dos quais os dados são acessados, também denominado como fábrica de objetos Sessions. Um objeto SessionFactory é threadsafe, porém deve existir apenas uma instância dele na aplicação, pois é um objeto muito pesado para ser criado várias vezes. Configuration (org..hibernate.Configuration) Um objeto Configuration é utilizado para realizar as configurações de inicialização do Hibernate. Com ele, define-se diversas configurações do Hibernate, como por exemplo: o driver do banco de dados a ser utilizado, o dialeto, o usuário e senha do banco, entre outras. É a partir de uma instância desse objeto que se indica como os mapeamentos entre classes e tabelas de banco de dados devem ser feitos. Transaction (org.hibernate.Transaction A interface Transaction é utilizada para representar uma unidade indivisível de uma operação de manipulação de dados. O uso dessa interface em aplicações que usam Hibernate é opcional. Essa interface abstrai a aplicação dos detalhes das transações JDBC, JTA ou CORBA. Interfaces Criteria e Query As interfaces Criteria e Query são utilizadas para realizar consultas ao banco de dados. Fonte:

17 JPA - Java Persistence API - Hibernate
Ciclo de Vida Explicação do Ciclo de Vida do Hibernate: Transiente (Transient)– o objeto ainda não foi persistido na base , ou seja, esse seu estado indica que o objeto só existem em memória. Persistente (Persistent)– o objeto foi salvo no BD em uso, e já poderá ser acessado de lá. Desatachado (Detached)- o objeto não é mais utilizado e será liberado para descarte pelo gerenciado de lixo (Garbage Collector) Fonte:

18 JPA - Java Persistence API - Hibernate
Anotações: @Id, @OneToOne… Explica aplicação das anotações

19 JPA - Java Persistence API - Hibernate
EntityManager Responsável pelo gerenciamento das entidades. Centralizador das operações (query e persistência) Persist Merge Update Remove Responsável pelo gerenciamento das entidades. Seja execução de querys ou persistência dos dados.

20 JPA - Java Persistence API - Hibernate
HQL (Hibernate Query Language) Select a from Aluno a Select a from Aluno a where a.id = :id from Aluno a where a = getAluno() Exemplo de execução Query query = getEntityManager().createQuery(“from Aluno a where a = :a”) query.setParamenter(“a”,entity.getAluno()) Aluno aluno = (Aluno)query.getSingleResult() Variações em Select. Possibilidade de usar um objeto como condição de filtro.

21 JPA - Java Persistence API - Hibernate
NamedQuerys @NamedQuery(name="Aluno.findAll", query="Select a from Aluno a"); query="Select a from Aluno a"), @NamedQuery(name="Aluno.findById", query=”Select a from Aluno a where a.id=:id") )}; Exemplo de execução Query query = getEntityManager().createNamedQuery(“Aluno.findById”); query.setParameter(”id", entity.getAluno().getId()); Aluno aluno =(Aluno) query.getSingleResult();

22 JPA - Java Persistence API
Comparação entre os Provedores de Persistência Fonte da pesquisa: Devemos entender as conclusões chegadas após o realizamento desta experiência para enfase e comentarios sobre os provedores de persistencia JPA. Fonte:

23 Prevayler Criado por brasileiros (Klaus Wuestefeld).
Conceito de Prevalência. EUA e Alemanha. Totalmente Orientado a Objeto. Prevayler é uma API Java para persistência, que implementa o conteito de prevalência. Prevalência é a arquitetura natural a se utilizar em qualquer sistema que tenha memória RAM suficiente para conter todos os seus dados. É bastante usado nos Estados Unidos e Alemanha. É totalmente orientado a objeto. Qual a diferença entre os BD relacionais e o Prevayler? Prevayler não é um banco de dados!

24 Prevayler Motivação Memória RAM barata;
Trabalhar com bancos relacionais não é fácil; Bancos OO têm baixo desempenho em grandes aplicações. Existem memórias de Terabytes e bem velozes. Dependendo da arquitetura, o código fica poluído com vários comandos SQL no meio de códigos Java. Modelo relacional não se adequou ao modelo orientado a objetos, fazendo com que tenhamos que converter de um modelo para o outro, como o Hibernate, ou usando SQL em misturado com códigos, como JDBC. Os bancos OO não trabalham bem com grandes quantidades de dados. A implementação é menos custosa do que o relacional, porém ainda muito complexa.

25 Prevayler ACID – Atomicidade, Durabilidade, Consistência e Isolamento.
Hoje existe a necessidade de fazer um mapeamento objeto-relacional

26 Prevayler Snapshot Memória Sistema Prevalente Snapshot
Existem dois conceitos importantes quando se trata de Prevayler. O primeiro é o snapshot.. Pega todos os objetos que estão em memória e grava em disco. É executado sempre que a aplicação é fechada. Isso é configurável no sistema. É o backup.

27 Prevayler Transações serializadas Log. Startup/Recovery. Sistema
Memória Snapshot Log Criar Alterar Remover O Outro conceito é o de transações serializadas. O Prevayler guarda todas as transações em arquivos de log. Esses logs são apagados sempre que há um snapshot.

28 Prevayler fonte: http://www.prevayler.org
The Prevalent System pattern is illustrated in the diagram shown here. Prevayler [1] serves as a transactional barrier for the business objects [2] of your application, held in memory. You encapsulate all modifications of your business objects into instances of the Transaction interface [3], much like a " command " pattern. Whenever you ask Prevayler to execute a transaction on your business objects [4], Prevayler first writes the transaction object to a journal [5] so that data is not lost if your system crashes. Prevayler can also write a snapshot of your entire business object graph [6] as often as you wish. Prevayler uses the latest snapshot together with the journals to automatically recover your business objects from disk [7] on application startup by restoring the snapshot and then re-executing every transaction that was originally executed after that snapshot was taken. fonte:

29 Prevayler Vantagens Licenças SGBD mais caro do que custo de adquirir memória RAM; Qualquer linguagem OO; Tudo a cargo do programador. Os SGBDs são mais caros do que memórias. Por exemplo, o Oracle custa 400 mil dólares. Existem implementações para Delphi, C#, Smalltalk, etc. O Programador tem que implementar a estrutura de dados do sistema. O programador não tem que se preocupar em modelos OO e Relacional.

30 Prevayler Desvantagens O sistema limita-se ao tamanho da memória RAM;
Maior esforço no planejamento do sistema; Como todos os objetos de negócio devem estar na memória RAM, o sistema limita-se ao tamanho desta. O programa fica limitado às configurações de máquina. É importante ter apenas o sistema prevalente rodando na máquina em questão. Existe um maior esforço do planejamento do sistema, pois o programador ficará responsável por tudo. O Prevayler não oferece as regalias que um SGBD oferece, como concorrência, integridade relacional, etc.

31 Prevayler Exemplo public class Pessoa implements Serializable {
private String nome; public Pessoa(String nome) { this.nome = nome; } public String getNome() { return nome; public void setNome(String nome) { public class ListaPessoas implements Serializable { private ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>(); //metodos add e remove } Neste exemplo será inserida uma pessoa. A lista de pessoas é a estrutura de dados do sistema prevalente.

32 Prevayler Exemplo public class AdicionaPessoa implements Transaction {
private String nome; public AdicionaPessoa(String nome) { super(); this.nome = nome; } public void executeOn(Object system, Date arg1) { ((ListaPessoas)system).add(new Pessoa(nome));

33 Prevayler Exemplo PrevaylerFactory factory = new PrevaylerFactory();
factory.configurePrevalentSystem(new ListaPessoas()); Prevayler prevayler = null; try { prevayler = factory.create(); prevayler.execute(new AdicionaPessoa(“Leo”)); } catch (Exception e) { e.printStackTrace(); }

34 Conclusão Java dispõe de diversas opções para persistência e mapeamento de dados O/R, portanto, para obter os melhores resultados, a utilização de cada tecnologia/framework deve ser analisada e aplicada considerando os requisitos e contexto da aplicação envolvida.

35 Dúvidas ?

36 Referências [IFRN] JDBC
[JDBC] [PROVIDERS COMPARISON] comparison.html [SUN] [Hibernate] [Prevayler] Site Oficial [Pamplona] Pamplona, Vitor [UFRGS] Saloon UFRGS WEB04Prevayler?rev=1.1;filename=WEB04Prevayler.pdf


Carregar ppt "Leo Silva Leonardo Murta Luiz Viana Persistência em Java."

Apresentações semelhantes


Anúncios Google