Aplicação web com db4o

É perfeitamente possível utilizar o db4o em ambientes web porque o seu banco de dados trabalha sempre em modo thread-safe. Servlets podem ser acessados por múltiplos threads, e as transações chamadas ao core do db4o são feitas em thread-safe.

Copie as bibliotecas do db4o para o diretório WEB-INF/lib para que a sua aplicação tenha acesso às classes responsáveis para a criação do servidor e do cliente da base de dados. E da mesma forma que funciona na versão desktop, nós não precisamos ter preocupações com mapeamentos, containers e outras complicações. Mesmo assim é preciso configurar algumas coisas. Primeiro devemos configurar o acesso ao arquivo do banco de dados e depois pensar em uma forma de criar somente um ObjectServer para toda a aplicação.

O funcionamento ideal seria a criação do ObjectServer no startup do contexto da aplicação e o fechamento da conexão quando o contexto também fosse fechado. Para isto é preciso criar uma Listener class, que não é fornecida pela API do db4o. Abaixo segue um código de exemplo de um Listener que vem juntamente com o tutorial do db4o:


package meuprojeto.dao;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.db4o.Db4o;
import com.db4o.ObjectServer;

public class Db4oServletContextListener implements ServletContextListener {
public static final String KEY_DB4O_FILE_NAME = "db4oFileName";

public static final String KEY_DB4O_SERVER = "db4oServer";

private ObjectServer server = null;

public void contextInitialized(ServletContextEvent event) {
close();
ServletContext context = event.getServletContext();
String filePath = context.getRealPath("WEB-INF/db/"
+ context.getInitParameter(KEY_DB4O_FILE_NAME));
server = Db4o.openServer(filePath, 0);
context.setAttribute(KEY_DB4O_SERVER, server);
context.log("db4o startup on " + filePath);
}

public void contextDestroyed(ServletContextEvent event) {
ServletContext context = event.getServletContext();
context.removeAttribute(KEY_DB4O_SERVER);
close();
context.log("db4o shutdown");
}

private void close() {
if (server != null) {
server.close();
}
server = null;
}

}

É bem simples visualizar o que este código faz. Quando o contexto é inicializado o db4oServer é instanciado e quando o contexto é parado, a conexão com o banco é finalizada.Depois configure o Listener para o application context de sua aplicação dentro do arquivo web.xml que pode ser encontrado no diretório WEB-INF:


<listener>
<listener-class>meuprojeto.dao.Db4oServletContextListener</listener-class>
</listener>

Observe que deve ser descrito o nome completo da classe (listando o pacote onde o listener está). Agora precisamos configurar o path do arquivo do db4o que será utilizado pelo Listener:


<context-param>
<param-name>db4oFileName</param-name>
<param-value>web.yap</param-value>
</context-param>

Observe que a constante KEY_DB4O_FILE_NAME do Listener possui o mesmo valor do context parameter.Acho esse tema interessante e, por isso, quero dar continuidade no próximo post trabalhando com um servlet efetuando operações de persistência e consulta de objetos no banco de dados.

Anúncios

~ por Glaucio Guerra em outubro 14, 2007.

14 Respostas to “Aplicação web com db4o”

  1. Olá glaucio tudo bem pensei em usar o db4o em um projeto web
    para a faculdade, neste projeto eu iria usar o db4o com algum
    container EJB, mas não consegui nenhuma fonte de ajuda.
    Queria saber se vc sabe como se conectar com o db4o utilizando
    algum container EJB como o glassfish por exemplo.
    Obrigado!!!

  2. Olá Cássio,

    É possível acessar o db4o a partir de qualquer container, de preferência os containers IOC que vão fornecer o mesmo tipo de ObjectServer para toda a sua aplicação.

    Um abraço!

  3. Muito bom Glaucio, já vou adicionar essas configurações no Loocrum.
    =)

  4. Ola tudo bom?
    Agora depois de fazer exatamente igual ao que vc fez… como faço pra salvar um Objeto no banco?
    Por exemplo… vamos supor que preciso cadastrar cliente
    que peguei atraves da tela .jsp
    como faço pra setar meu cliente e salvar em um banco?
    att,
    Jota

  5. Obs :
    utilizo o eclipse com javaServer faces

  6. Olá,

    Vou escrever um artigo explicando isso. Mas você faria da mesma forma que no desktop:

    Pegar a instância do ObjectServer que o seu container fornece;
    Criar um ObjectContainer a partir do ObjectServer;
    Fazer o set do seu objeto no ObjectContainer e pronto!

    Não esqueça de fechar as conexões!

    Maiores informações:

    http://www.devmedia.com.br/articles/viewcomp.asp?comp=4495

    Um abraço!

  7. puts valew… vou tentar aqui…
    qualquer problema eu te procuro!

  8. como recupero um ObjectServer do contender?
    Qual o codigo que eu utilizo para Criar um ObjectContainer a partir do ObjectServer?
    abraço!

  9. Olá,

    como recupero um ObjectServer do contender?
    No próximo post vou explicar como se faz isso. Você vai recuperar via IOC?

    Qual o codigo que eu utilizo para Criar um ObjectContainer a partir do ObjectServer?
    http://www.devmedia.com.br/articles/viewcomp.asp?comp=4495

    Abraço!

  10. Analise comigo:
    public class DAOUsuario {
    ObjectServer server;

    public void incluirUsuario(Usuario usuario) {
    ObjectContainer objusuario = server.openClient();
    objusuario.set(usuario);
    objusuario.close();
    server.close();
    }
    }

    //Dudidas:
    Como faço para recuperar o meu ObjectServer (fornecido pelo conteiner)?
    eu criei um arquivo db4oFileName na session certo? qual a função dele?

  11. ObjectServer server;
    // quando eu crio aki como ele vai saber que é o server que eu criei dentro Container ( na classe Db4oServletContextListener)??
    pq se eu apenas deixar assim…

    ObjectServer server;

    Meu ObjectServer sera nulo correto?

    eu nao tenho nem ideia de como resolver isso ainda 😉

  12. Ola novamente!

    no capitulo 18 do tutorial de servlet onde eu coloco o codigo proposto?

    ObjectServer server=
    (ObjectServer)context.getAttribute(“db4oServer”);

    Atenciosamente!
    Jota

  13. Olá,
    Solução resolvida… assim que terminar o projeto eu passo para voces!
    abração para todos

  14. Olá Jota,

    Que bom que conseguiu resolver o problema!

    Um abraço!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

 
%d blogueiros gostam disto: