banco de dados não convencionais fausto maranhão ayres 14 bdoo – db4o

42
Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Upload: internet

Post on 21-Apr-2015

106 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Banco de Dados não ConvencionaisFausto Maranhão Ayres

14 BDOO – db4o

Page 2: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 2

Características do DB4O

Nasceu em 2001 (www.db4o.com) Foi comprado pela VERSANT

Nativo para Java, .Net, Android (portabilidade)

Embarcado: 400k de RAM (.jar ou .dll)

Cliente/Servidor

Baixo custo Licença GPL Não necessita de administração arquivos com 450 Gb

Visualização dos objetos: ObjectManager

Page 3: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 3

Versão 7.4

Page 4: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 4

Plugin Eclipse

Install new Software

http://db4o-eclipse.googlecode.com/svn/trunk/com.db4o.eclipse.update/

Page 5: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 5

Características do DB4o

Usuários em mais de168 países:

Casos de Sucesso sistema de controle de trens bala espanhol - AVE.

Page 6: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 6

Características do DB4o

Segurança há a possibilidade de criptografar informações no banco

Desempenho Armazena até 200.000 objetos/segundo 44x mais rápido se comparado com o Hibernate+Mysql

Tabela comparativa: http://www.polepos.org

Page 7: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 7

Tabela comparativa

http://www.polepos.org

Page 8: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 8

Persistência Transparente

Não necessita de anotações

A propagação da persistência é automática

Permite indexação de atributos da classe

Qualquer mudança na estrutura do objeto é detectada em tempo de execução (via reflexão) e propagada no BD

Page 9: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 9

Persistência Transparente

Pode-se definir atributos Não-Persistentes

public class Pessoa {

private String nome;

transient String idade;

...

}

public class Pessoa {

private String nome;

transient String idade;

...

}

Page 10: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

API

Page 11: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 11

API

com.db4o – principal com.db4o.ext – extensões com.db4o.config – configurações com.db4o.query – consultas nativas

Page 12: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 12

com.db4o.ObjectContainer

Gerencia objetos persistentes

ObjectContainer db; //o nosso manager

db.openFile()

db.close()

db.store() // substituiu db.set()

db.queryByExample() // substituiu db.get()

db.delete()

db.commit()

db.rollback()

Versão anteriorVersão anterior

Page 13: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 13

Abrir, Fechar, Gravar, Atualizar

import com.db4o.*; ...ObjectContainerObjectContainer db = Db4o.openFile(“banco.db4o”);

Pessoa p = new Pessoa(“joao”, 25);

db.store(p);

db.commit();

p.setIdade(15);

db.store(p); //regravação (atualização)

db.commit();

db.close();

A operação store() inicia uma transação. Um commit() ou close() confirma a transação

A operação store() inicia uma transação. Um commit() ou close() confirma a transação

para apagar o arquivo antes use :

new File(“banco.db4o”).delete();

para apagar o arquivo antes use :

new File(“banco.db4o”).delete();

Page 14: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 14

Transação

ObjectContainer db = Db4o.openFile(“banco.db4o”);

try{

...

...manipulação dos objetos

db.commit();

}

catch(Exception e){

db.rollback();

}

finally{

if (db!= null) db.close();

}

ObjectContainer db = Db4o.openFile(“banco.db4o”);

try{

...

...manipulação dos objetos

db.commit();

}

catch(Exception e){

db.rollback();

}

finally{

if (db!= null) db.close();

}

Page 15: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 15

Recuperação de Falhas

Existe uma proteção contra falhas de hardware, energia, jvm, etc, durante um commit

DB4o usa a estratégia resume-commit-on-crash onde o commit que falhou é re-executado quando o bd for reaberto

Page 16: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 16

Visualização dos objetos no banco

Execute ObjectManager.bat

objeto

classe

Page 17: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 17

Consultas básicas

Um objeto é recuperado a partir de um “objeto exemplo”, contendo os campos de buscaEx: localizar o joao

ObjectSet <Pessoa> resultados =

db.queryByExample(new Pessoa(“joao“, 0));

if(resultados.size()>0)

Pessoa p = resultados.get(0);

else

System.out.println(“inexistente”);

objeto exemplo -

busca por nome

objeto exemplo -

busca por nome

Implementa a interface ListImplementa a interface List

Page 18: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 18

Consultas básicas

Ex: Listar todas as pessoas com idade = 40

Pode-se usar array ou coleções na consulta

List<Pessoa> resultados = db.queryByExample(new Pessoa(null, 40));

for(Pessoa p: resultados) System.out.println(p);

List<Telefone> lista = new ArrayList...lista.add(“8800-7666”);lista.add(“8770-1122”);

List<Pessoa> resultados = db.queryByExample(new

Pessoa(null,0,lista));...

Page 19: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 19

Consultas básicas

Ex: Listar todos os empregados (e subclasses)

Ex: Listar todos os vendedores

List<Empregado> resultados =

db.query(Empregado.class);

for(Empregado p: resultados)

System.out.println(p);

List<Vendedor> resultados =

db.query(Vendedor.class);

for(vendedor p: resultados)

System.out.println(p);

Page 20: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 20

Unicidade de objetos no BD

Um BDOO não tem chave primária É de sua responsabilidade verificar a existência de um

objeto antes de gravá-lo Para isso, você arbitrará um atributo como chave

Ex: usar nome como chave

List<Pessoa> resultados =

db.queryByExample(new Pessoa(“joao“,0) );

if(resultados.size() == 0){

db.store( new Pessoa(“joao“, 25) );

db.commit();

}

objeto exemplo com chave “joao”objeto exemplo com chave “joao”

objeto gravado sem duplicataobjeto gravado sem duplicata

Page 21: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 21

Remover um objeto

Deve-se localizar o objeto antes de remove-loEx: apagar o joao

List<Pessoa> resultados = db.queryByExample( new Pessoa(“joao“,0) );

if(resultados.size() > 0) {

Pessoa p = resultados.get(0);db.delete(p);db.commit();

}else

System.out.println(“inexistente”);

objeto exemploobjeto exemplo

Page 22: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 22

Remover todos os objetos do bd

Ex: apagar todas as pessoas

Ex: apagar todos os objetos

List<Pessoa> resultados = db.query(Pessoa.class);

for(Pessoa p: resultados) {

db.delete(p); db.commit();

}

List<Object> resultados = db.query(Object.class);

for(Object o: resultados) {

o.delete(p); db.commit();

}

Page 23: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 23

Persistência em Cascata

A persistência de um objeto é feita, automaticamente, em cascata. Ex:

Pessoa p = new Pessoa(“joao“,25);

p.addTelefone( “8800-1111”);

p.addTelefone( “8800-2222”);

db.store(p);

db.commit();

...Os telefones também serão gravados junto com Pessoa

Os telefones também serão gravados junto com Pessoa

Page 24: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 24

Atualização em Cascata

A atualização de um objeto não é feita em cascata. Ex:

List<Pesssoa> resultados =

db.queryByExample(new Pessoa(“joao“,0));

Pessoa p = resultados.get(0);

p.addTelefone(“8800-3333”);

p.addTelefone(“8800-4444”);

db.store(p);

db.commit();

...

Esses novos telefones não serão gravados!!Esses novos telefones não serão gravados!!

Page 25: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Configurações

Page 26: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 26

Atualização em Cascata

Para que a atualização, exclusão e recuperação seja feita em cascata, devemos configurá-las antes de abrir o banco:

Configuration conf = Db4o.newConfiguration();

conf.objectClass(Pessoa.class).cascadeOnUpdate(true);

conf.objectClass(Pessoa.class).cascadeOnDelete(true);

conf.objectClass(Pessoa.class).cascadeOnActivate(true);

...

ObjectContainer db= Db4o.openFile(conf , “banco.db4o”);

Page 27: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 27

Cuidado!!!

Se duas pessoas referenciarem o mesmo telefone e a primeira delas for excluída em cascata?

A segunda pessoa ficará sem telefone e ocorrerá um erro ao tentar acessá-lo

Page 28: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 28

Refatoração Automática

Cada vez que o sistema é iniciado, o db4o verifica se houve alguma alteração na estrutura da classe. Inclusão de atributo

db4o adiciona automaticamente o novo atributo e armazena valores default para os objetos antigos

Remoção de atributo db4o ignora os atributos excluídos quando recupera

um objeto. Os atributos são efetivamente removidos quando o bd é defragmentado.

Para desabilitar a refatoração automática:conf.DetectSchemaChanges(false);

Page 29: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 29

Indexação

Índices otimizam o acesso aos objetos É especificado na configuração do banco:

conf.objectClass(Pessoa.class).objectField(“nome“) .indexed(true);

Page 30: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Consultas

Page 31: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 31

Tipos de consultas

1. Query-By-Example

2. Native Queries

3. S.O.D.A

Page 32: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 32

1- Query By Example

resp = db.querByExample(new Pessoa(...));

Limitações Consulta só de igualdade

Não podemos indicar quais elementos não participarão da consulta?

Não podemos usar AND, OR, NOT, etc. Não podemos manipular valores default (0, "“,   null) Não podemos inicializar atributos na sua declaração da

classe

Page 33: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 33

2-Native Queries (NQ)

São escritas na própria linguagem Java Permite código 100% tipado, compilado e refatorável permite aplicar um trecho de código para todos os

objetos da classe. Permite usar métodos da própria classe

List<Empregado> lista = db.query( new Predicate<Empregado>() {

   public boolean match(Empregado e) { return e.getSalario() > 1000;      }

});

List<Empregado> lista = db.query( new Predicate<Empregado>() {

   public boolean match(Empregado e) { return e.getSalario() > 1000;      }

});

É executado para cada instância

É executado para cada instância

Page 34: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 34

3- S.O.D.A

Simple Object Database Access é uma API de consulta baseada em nós de grafos para criação de consultas dinâmicas. Ela permite executar consultas no servidor, reduzindo

o tráfego de rede e o tempo de execução da consulta. Desvantagem:

usa strings para identificar campos, não sendo 100% tipada nem compilada.

Page 35: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 35

Exemplo

Consulta sobre o grafo de objetos

Query q = db.query();

q.constrain(Pessoa.class);q.descend("telefones").descend("numero").constrain(“8800-7755”);

List<Pessoa> result = q.execute();println( result.next() );

Query q = db.query();

q.constrain(Pessoa.class);q.descend("telefones").descend("numero").constrain(“8800-7755”);

List<Pessoa> result = q.execute();println( result.next() );

Page 36: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 36

Otimização de bytecodes

Uma consulta NATIVA é transformada internamente numa consulta SODA

Os bytecodes do método match() são otimizados, visando o mínimo de instanciação de objetos na memória Otimizador de bytecodes -> nqopt.jar

Page 37: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Pacote com.db4o.ext(extensões)

Page 38: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 38

package com.db4o.ext

A classe ExtObjectContainer contém métodos avançados: Verificar se objetos estão gerenciados pelo container Obter a lista de classes gerenciadas pelo container, Gerenciar concorrência, etc Acesso

ExtObjectContainer ext = db.ext()

Page 39: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 39

Refresh

Recarregar um objeto para a memória

Pessoa p = db.queryByExample(new Pessoa(“joao”));p.setNome(“joana”);

println(p); //joanadb.ext().refresh(p, Integer.MAX_VALUE);println(p); //joao

Page 40: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 40

Acesso ao OID do objeto

OID = identificador interno do objeto

// obter o OID do objetoPessoa p = db.queryByExample(...);long oid = db.ext().getID(p) ;

//acesso ao banco usando OIDp = (Pessoa) db.ext().getByID(oid) ;

Page 41: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

FIM

Fausto Maranhão Ayres 41

Page 42: Banco de Dados não Convencionais Fausto Maranhão Ayres 14 BDOO – db4o

Fausto Maranhão Ayres 42

Persistindo um objeto complexo

Exemplo:

//gravação

Set<Aluno> alunos = new HashSet<Aluno>(); ...

db.store(alunos);

//leitura

ObjectSet result =

db.queryByExample(new HashSet<Aluno>());

alunos = result.next()