banco de dados não convencionais fausto maranhão ayres 14 bdoo – db4o
TRANSCRIPT
Banco de Dados não ConvencionaisFausto 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
Fausto Maranhão Ayres 3
Versão 7.4
Fausto Maranhão Ayres 4
Plugin Eclipse
Install new Software
http://db4o-eclipse.googlecode.com/svn/trunk/com.db4o.eclipse.update/
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.
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
Fausto Maranhão Ayres 7
Tabela comparativa
http://www.polepos.org
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
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;
...
}
API
Fausto Maranhão Ayres 11
API
com.db4o – principal com.db4o.ext – extensões com.db4o.config – configurações com.db4o.query – consultas nativas
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
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();
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();
}
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
Fausto Maranhão Ayres 16
Visualização dos objetos no banco
Execute ObjectManager.bat
objeto
classe
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
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));...
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);
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
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
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();
}
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
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!!
Configurações
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”);
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
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);
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);
Consultas
Fausto Maranhão Ayres 31
Tipos de consultas
1. Query-By-Example
2. Native Queries
3. S.O.D.A
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
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
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.
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() );
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
Pacote com.db4o.ext(extensões)
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()
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
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) ;
FIM
Fausto Maranhão Ayres 41
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()