Prevayler, Hibernate e EJB - O que vocês acham?

31 respostas
S

[color=“blue”]Oi pessoal !!! Eu estava pesquisando na internet sobre JSP e encontrei algumas coisas que falavam do prevayler, eu nem sabia o que era prevalencia de objetos mas comecei a procurar e acho que consegui entender bastante coisa sobre a parte conceitual. :wink:

O que mais me ajudou foi um artigo no próprio guj que falava sobre o Hibernate, mas o prevayler segue o mesmo conceito não é ? Aproveitando, gostaria de saber se alem da velocidade o prevayler tem alguma vantagem em relação ao Hibernate. A velocidade do prevayler é realmente impressionante… 8)

Não entendi também porque quando eu utilizo o Hibernate ou Prevayler não preciso utilizar EJB… eu achei muito legal esse assunto e gostaria que pudessemos discutir aqui da maneira mais simples e prática possível para que todos possam entender. :idea:

Valeu pessoal !!!
SkyBlue[/color]

31 Respostas

louds

O grande problema do prevayler é atomicidade das transações, utilizando o SnapshotPrevayler se tua transação der errado, depois que tiver começado a alterar os objetos, chore pq voce está diante duma aplicação com estado inconsistente; e o RollbackPrevayler é UMA grande piada, usar 2x mais memoria é solução lusitana.

Outro pepino é ter que ficar escrevendo UMA tonelada de código para as transações e ter que explicitamente se preocupar com locking.

O último problema do prevayler, que deve dar um boa dor de cabeça para contornar, é se voce for utilisar com uma base de dados muito grande, maior que a memoria física.

Hibernate e Prevayler substituem apenas os Entity Beans do EJB.

urubatan

da uma olhada na MundoJava deste mes :slight_smile:

tem artigos sobre Hibernate, Prevailer, OJB e JDO (JDO por mim mesmo :slight_smile: )

ta muito boa a revista

gostei muito também do artigo sobre o Commons Digester do CV :slight_smile:

cv1

Atomicidade de transações não é um problema se vc fizer transações atômicas :wink:

O caso é que tem operações que não podem ser atômicas (transferir dinheiro de uma conta para a outra envolve tirar dinheiro de uma e somar em outra, por exemplo). Nesses casos, atomicidade não é problema nenhum se vc checar todos os seus constraints antes de fazer qualquer coisa no modelo de dados - o que não é nenhum bicho de sete cabeças, mas ainda assim, meio chato. Estamos pensando em como deixar isso mais eficiente, e algumas idéias bem legais pipocaram. Talvez vc também tenha alguma? :smiley:

Quanto aos rollbacks, concordo com vc aqui, as implementações de rollback pro Prevayler ainda estão engatinhando, tanto que elas não estão no release estável (1.x). Alguma idéia que a gente possa usar pra melhorar o suporte a rollback, entre outras coisas?

Não sei onde vc viu que tem que se preocupar explicitamente com locking (já que o Prevayler só executa transações serialmente), mas escrever código pras transações é mesmo bem chato. Por isso eu tou usando Prevayler debaixo dum framework de AOP :wink:

Pois é. O jeito que a JVM usa a memória não é lá nada amigável ao gerenciador de memória dos sistemas operacionais, e ela se torna uma carroça total quando o SO começa a fazer swap da heap.

Uma solução, no entanto, é não colocar todos os dados em RAM (por exemplo, ao inves de colocar uma imagem, coloque a Url que se refere a ela), ou particionar o sistema em diversos sistemas, mais “digeríveis”, ou ainda bolar algum tipo de Collection que faça paging de objetos pro disco automaticamente (eu pensei num treco desse tipo há um tempo atrás, e a minha implementação ficou uma bosta, mas definitivamente é possível).

louds

O problema desse modelo IMHO é a fragilidade do sistema, verificar os constrains voce teria de também fazer com outros sistemas, porem pode acontecer alguma exception que no não tinha previsto (null pointer, class cast, etc) e pronto, teu sistema ta inconsistente.
Minha sujestão provalvelmente já foi dada, porêm ai vai ela: Divida um transação em unidades atômicas de trabalho.
poderia ser algo +/- assim pro caso da retirada de dinheiro:

Transaction t = prevayler.newTransaction();
t.do(new Retirada("cv", "louds", 1milhão, dolares));
t.do(new Deposito("louds", 1 milhão, dolares));
t.commit();

...

class Transaction{
void commit(){
ArrayList commit = new ArrayList();
try {
 for(cmd in comandos) {
   cmd.do();
   commit.add(cmd);
}catch(Throwable t){
   for(cmd in commit)
     cmd.undo();
}
}

Esse código, assim como está não é seguro, porem é só 1 idéia.

Olha 1 projeto chamado PERST.

Realmente falei besteira mesmo, eu me referia ao problema de voce poder ver o sistema em um estado inconsistente; no exemplo acima, alguem usando o sistema poderia acabar vendo sua conta com uns trocado a menos e a minha faltando dinheiro.

“cv”:

Pois é. O jeito que a JVM usa a memória não é lá nada amigável ao gerenciador de memória dos sistemas operacionais, e ela se torna uma carroça total quando o SO começa a fazer swap da heap.

Uma solução, no entanto, é não colocar todos os dados em RAM (por exemplo, ao inves de colocar uma imagem, coloque a Url que se refere a ela), ou particionar o sistema em diversos sistemas, mais “digeríveis”, ou ainda bolar algum tipo de Collection que faça paging de objetos pro disco automaticamente (eu pensei num treco desse tipo há um tempo atrás, e a minha implementação ficou uma bosta, mas definitivamente é possível).

Denovo eu sugiro vc olhar esse projeto, o PERST, é bem legal.
Oque o prevayler poderia fazer, é usar dynamic proxies pros objetos persistentes e carregar/salvar objetos on-demand[/code]

cv1

http://www.garret.ru/~knizhnik/perst.html

Right?

louds

ahan
Vale um olhada no GOODS também, porem ignore o java binding, achei fraquinho

T

Sou uma pessoal muito entusiasta por novas tecnologias e achei a tecnologia do prevayler muito interessante. Eh uma ideia simples e muito pratica. Quantos sistemas eu ja fiz, que precisava guardar meia duzia de dados e usei um rdbms por falta de opcao. O prevayler cairia como uma luva.

Agora uma coisa que eu nao posso deixar de criticar e a audacia dos desenvolvedores. Acho no minimo uma falta de etica ficar desmerecendo outras tecnologias , outros fabricantes , dizendo o prevayler ser a solucao universal para seus problemas.

Realmente eh impressionante o ganho de performance para realizar o teste equivalente ao SELECT * FROM TABLE WHERE id=x. Pelo fato dos objetos ja estarem na memoria , organizados em uma estrutura de dados (provavelmente uma array ou hash) isso nao seria mais do que a obrigacao do sistema, ser mais performatico que um JDBC, uma camada de rede ate chegar a um banco de dados (se bem que poderiamos subir o codigo java para dentro de um oracle, como uma stored procedure em java do oracle, para eliminar essas camadas, mas isso nao vem ao caso).

Agora ficar fazendo propaganda em cima disso para promocao pessoal acho um absurdo. que facam um teste completo entao. Por exemplo, envolvendo alteracoes. Nao somente isso, qual o comportamento do sistema quando tivermos mais de uma thread usando o sistema, como serao feito os locks? Existe a possibilidade, ou o suporte a um lock otimista, coisa desse tipo? Isso me lembra os velhos problemas de microbenchmarks.

Soh para citar um caso, sem desmerecer produtos, vejamos o caso do Mysql, que muita gente acha mais rapido que o Oracle. Eh verdade, ele pode vir a ser para um determinado nicho de aplicacoes, como por exemplo, uma tabela onde soh existe consulta. Mas quando vamos realmente usar o banco de dados com leitura e escrita na mesma tabela, e essas coisas de maneira pesada, vemos a diferenca, o mysql , usando o myisam , apresenta um lock de tabela, que deixa o sistema incrivelmente lerdo.

Acho importante a divulgacao desta nova tecnologia do prevayler, mas nao concordo com o modo que vem sendo feito. acho o discurso um pouco ousado de mais e para que nao falar, ate certo ponto, mentiroso. Mentiroso pela omissao de detalhes. Conheco uma outra empresa que tem essa mesma estrategia,a M$. Espero estar redondamente enganado em relacao aos desenvolvedores do prevayler e que eles trabalhem duramente para fazer um software de qualidade e realmente util para todos. E que finalmente, aprendam a conviver com outros projetos, como parceiros. Existem ferramentas certas para todo o tipo de projeto, e acredito que o nicho que o prevayler pode pegar eh muito grande realmente.

cv1

tanque, como desenvolvedor do Prevayler, eu tenho que concordar com vc - o “marketing” do Prevayler é bem agressivo, e disso nem dá pra discordar.

Mas concordo também com o Jon Tirsén, um dos desenvolvedores mais ativos ultimamente: se a gente não batesse a cabeça das pessoas na parede enquanto berra “PÁRA DE PENSAR EM TABELA, CARALHO!”, a coisa nao ia pra frente nunca.

Às vezes, é preciso muito mais do que um simples “ei, nós estamos aqui, e nosso código é bom pra um monte de situações”. Às vezes - e, acredito que esse seja o nosso caso - é preciso um monte de barulho pra fazer com que as pessoas pensem um pouco melhor ao invés de simplesmente dizer “tá, mantenha todos os dados em RAM, grande coisa, pfff”. :smiley:

Bom, sobre os benchmarks, eles não foram tão mal-pensados como vc pinta. Dê uma olhada no código - e se vc for executá-los, lembre-se de dar ao Oracle uma vantagenzinha colocando ele em um ramdisk :wink:

louds

Poderia também ser incluso um exemplo utilizando uma base de dados com uns 20 gira rodando num PC comum. hehehehehe

cv1

Cara, qual a chance de vc ter que mexer num sistema com uma base de 20gb? :smiley:

Sério, até hoje eu não tive que mexer em nenhuma aplicação assim. Isso é uma coisa que todo mundo critica o Prevayler por não suportar bem, mas ninguém chegou pra gente até agora e falou “Ei, eu sou louco o suficiente pra botar uma massa de dados grande num sistema rodando em Prevayler. Voces me ajudam?” (dica dica :D) :wink:

louds

se o problema é esse cv, quero implementar nfs usando prevayler. hehehe

ahhh, me refiro nfs = number field sieve. quero implementar visando primos de 512bits.

Ironlynx

Louds:

ahhh, me refiro nfs = number field sieve. quero implementar visando primos de 512bits. :shock:

Cv,vc já submeteu o Prevayler a um teste de estresse,digo,até onde ele pode aguentar e o custo/benefício de se adicionar + Ram ficará digamos,
inviável?Qdo falo custo/benefício tô querendo dizer qdo o ganho de velocidade do sistema deixa de ser compensatório…

cv1

Jah sim… da pra adicionar e ler objetos ao sistema em velocidade praticamente constante (usando bem a API de Collections), ate que vc esbarra no limite da RAM, e a o SO comeca a fazer swap da memoria da VM. Ai, fodeu geral a performance, salve-se quem puder, corram ate a Santa Ifigenia e comprem um pente de 1gb :smiley:

Isso depende mais da sua aplicacao do que do Prevayler, nao acha? Se eu tivesse fazendo um sistema de processamento bancario, onde um segundo ja da uma diferenca enorme na performance geral da aplicacao, 512mb a mais de RAM ia ser fichinha :wink:

Ironlynx

Digamos q eu faça um TIA(Terminal de Informações Acadêmicas),e ao
invés de BD ,eu resolvesse usar o Prevayler,vamos considerar que a RAM
não é o problema(imaginamos que eu tivésse uns 16Gb :shock: ),Além de um servidor p/redundância(igualmente poderoso) q poderia executar os Snapshots,será q ele conseguiria executar as prováveis transações com segurança?Imagine uma base de 100.000 alunos,100 k por aluno,q
podem num único dia fazer uns 10.000 acessos ao sistema(e operações
de inclusão-exclusão de diciplina-matrícula,solicitação de segunda via de
Pgto de mensalidade…) seria um bom uso p/o programa?
Esse caso aí de cima é meu provável projeto final,mas eu queria alguma
inovação,ao invés da tradicional fórmula JSP-Controlador-BD…
Nota:esses 100.000 alunos correspondem ao total real…,mas para efeito de apresentação uma base de 100 é mais do que suficiente.
Como eu tenho 1ano para executar esse trabalho,aceito sugestões
sobre implementação…

cv1

“Ironlynx”:
Imagine uma base de 100.000 alunos, 100 k por aluno, q podem num único dia fazer uns 10.000 acessos ao sistema (e operações
de inclusão-exclusão de diciplina-matrícula, solicitação de segunda via de
Pgto de mensalidade…) seria um bom uso p/o programa?

100k POR ALUNO!? :shock:

Cara, 100k por aluno eh muita coisa. Tente escrever 100k de texto e vc vai entender o que eu estou dizendo :wink:

Ue, entao escreva o programa usando um mecanismo plugavel de persistencia, e nas demonstracoes use, por exemplo, Prevayler, Hibernate e EJB CMP :wink:

Bom, acabei de dar uma, mas se vc estiver afim de outra, de uma olhada em AOP :smiley:

Ironlynx

Valeu pelas dicas,Cv!
Eu botei 100k por aluno pq tem muita coisa q eu omiti…(histórico,
oferta de enpregos,atividades extra-curriculares…na minha facul o
TIA tem td isso…por isso eu botei 100k disponíveis de info,para ter sobra…) :wink:

louds

Uma coisa que o pessoal do prevayler esconde é o custo de garbage collection que aumenta. Usando métodos ortodoxos (JDBC, Hibernate, EJB CMP, etc) voce não causa tanta pressão de memoria e logo as pausas de GC são menores.
Alguem deveria fazer uma analise de um sistema não muito pequeno, algo como Presto, para ver qual a relação entre objetos do sistema e objetos persistentes e, de repente, comparar com o PetStore da Sun.

S

[color=“blue”]Oi pessoal !!! Esta discussão foi muito legal mais vejo que ainda estou um pouco por fora sobre o assunto, vários termos e conceitos que vocês mencioram eu não entendi mas vou fazer o possível para aprender porque achei esse assunto muito interessante. :slight_smile:

Eu estava lendo uma apostila sobre MVC e gostaria que vocês exclarececem se o Prevayler é um banco de dados ou se é uma camada(middleware) entre os EJBs e o banco de dados ? Pelo que eu entendi o conceito que o Prevayler usa é o de ser um middleware. :?:

Outra questão que eu queria colocar, o cv é que deve estar mais por dentro disso, é se o projeto Prevayler pretende incluir novos recursos que ele ainda não possui em relação ao Hibernate por exemplo ou se pretendem só otimizar o frame-work que ja esta pronto. :roll:

Valeu pessoal !!!
Skyblue[/color]

cv1

O Prevayler nao eh um middleware, nem um banco de dados (uma vez que ele nao implementa queries nem aquele zilhao de coisas). Ele eh soh um mecanismo de persistencia de objetos, e mais nada - por isso, mtas vezes, que ele eh bom - simplicidade :smiley:

K

Na verdade nada impede que seja feito um sistema hibrido onde dados com baixo acesso fiquem num DBMS e dados com alto acesso fiquem na memoria e prevalescentes.

R

Caras, considerando que:

  1. Todo mundo concorda que a tecnologia de objetos é superior ao modelo relacional.
  2. Todo mundo sabe que a teoria relacional tem mais de 30 anos de existência.
  3. O prevayler nem tem 3 anos ainda.
  4. A quantidade de empresas que desenvolvem e mantem banco de dados é enorme.
  5. Os desenvolvedores do prevayler são meia dúzia de gatos pingados
  6. Os mecanismos de lock e transações dos bancos não são nenhuma maravilha
  7. Qualquer programador bom consegue encapsular suas transações em métodos bem construídos.
  8. O prevayler está na versão 1.
  9. A memória RAM não é tão cara assim ( e quem tem uma base de 20Gb também deve ter grana (hic)).
  10. O prevayler é uma ALTERNATIVA; não uma imposição.
  11. A serialização de objetos é uma tecnologia que permite (além do armazenamento) a comunicação entre linguagens diversas.

acho que essa discussão não tem pé nem cabeça.

Uso serialização de componentes desde o delphi (armazenava 1 milhão de objetos em menos de 10 segundos e recuperava qualquer um deles em 1 segundo) e hoje estou estudando o prevayler.
Ainda não consegui tirar muito proveito dele, mas com certeza vou usar ele em muitas implementações, incluindo meu projeto (o metagen).
Talvez existam coisas que o prevayler não faça bem, mas pô, ele é uma criança ainda!
E finalmente, falando em marketing, acho que se o pessoal que promove o prevayler não correr atrás e falar bem, quem vai fazê-lo ?

cv1

Marcelo, primeiramente, parabens pelo post. Otimos argumentos, apesar de eu achar que minha opiniao nao cona :wink:

Só pra acrescentar uma coisinha de nada, o Prevayler está atualmente na versão 2 para testes, e 1 para produção:

Ironlynx

Futuro Prevayler Developer:
List prevayler=new ArrayList();
[color=“red”]prevayler.add(“Ironlynx”);[/color]

S

[color=“blue”]Oi pessoal !!! Aproveitando que esta discussão voltou, eu gostaria de saber uma coisa que eu ainda não entendi corretamente. Existe alguma diferença entre Persistencia de Objetos e Persistencia de Dados ??? Qual é a definição correta ? :?:

Sei que essa dúvida é bem básica mais gostaria que respondessem… :wink:

Valeu pessoal !!!
SkyBlue[/color]

cv1

O uso destes termos jah tah tao confuso que eu nao sei se essa definicao ainda vale…

Mas, de qualquer forma, la vai: persistencia de objetos eh a persistencia de dados que, de uma forma ou de outra, mantém os atributos dos objetos com o encapsulamento que os objetos definiram.

Ou seja, quando vc persiste um dado, ele vai parar num meio de armazenamento qualquer, e qualquer um que saiba lidar, e tenha permissões para lidar com este dado vai poder acessar as informações que quiser.

Quando vc persiste um objeto, e recupera ele mais tarde, os atributos privados continuam privados, e vc não consegue acessá-los. Não é um mecanismo de segurança, mas só de encapsulamento.

(Falei besteira? :D)

Ironlynx

Completando o Cv,
Persistência é a capacidade de um objeto(ou dado) sobreviver fora dos limites da aplicação que o criou,ou seja tem a propriedade(mecanismo) de serem armazenados em memória secundária(o disco).
Persistencia de dados em meio de armazenamento qualquer(como falou o Cv)se refere aos dados das tabelas de banco de dados(por exemplo);
Persistencia de objetos, geralmente,será usada para referir objetos JAVA,como um arquivinho .properties contendo um ArrayList com vários dados (e atributos q estão encapsulados-private-como disse o Cv) de Um usuário(um root de uma aplicação por exemplo).Deve-se salientar tb que persistir um dado geralmente está associado a estrutura relacional de um banco(Calma!Vc pode gravar um arq.txt q tb é persistir um dado…tô sendo genérico).Uma relação é uma tabela com linhas e colunas q contém um tipo SIMPLES de dado em cada uma delas(como Integer,Char String). Objetos podem ser muito mais complexos(e possuir todos esses tipos do BD relacional) e adaptá-los a um Bd exige carga extra de programação.Para isso utilizamos Design Patterns ou um Framework q seja capaz de fazer o mapeamento objeto-relacional.

Só um detalhe:Objetos que existem somente em RAM(no contexto q dura a execução de sua aplicação),são ditos transitórios ou transientes. :wink:

rfpsatin

“rocket”:
Caras, considerando que:

Uso serialização de componentes desde o delphi (armazenava 1 milhão de objetos em menos de 10 segundos e recuperava qualquer um deles em 1 segundo) e hoje estou estudando o prevayler.

Como assim? como faz isso no delphi

rfpsatin

CV

que tal um tutorial básico do uso prático do prevayler?

abraço

cv1

http://www-106.ibm.com/developerworks/library/wa-objprev/ :wink:

rfpsatin

boa,

abraço

trainpotting

sho para constar um ponto de vista de novato no grupo.

entendo que quando alguem fala sobre o prevayler ter 3 anos versus sql ter 30…
isto tambem pode ser uma provocacão para se desenvolver um ‘compiere’ customizado ‘open’ com regras e extruturas descoladas do oracle (conceito inicial) ou de qualquer outro db.
argumentava-se que a ligacao com o oracle devia-se ‘a velocidade’ ,logo, temos um argumento para implementar efetivamente um erp open. talve um um ERPrevayler.
ja tiveram iniciativas inclusive com financiamento publico, mas vejo que esta lacuna ainda nao foi preenchidade de forma satisfatoria, ate porque o mais interessado em um erp open e o proprio gov pois aumenta sua receita.
para quem ja entrou em barcos furados open ou iniciativas de sucesso quais resistencias de toda natureza para um erprevayler rsrs
para nao desviar do foco mas ja desviando, qual o erp do governo?

abs

Criado 20 de setembro de 2003
Ultima resposta 23 de jul. de 2008
Respostas 31
Participantes 10