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

[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]

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.

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:

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).

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.

[quote=“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).[/quote]

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]

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

Right?

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

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.

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:

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

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:

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

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

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…

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:

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…

[quote=“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?[/quote]

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:

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:

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.

[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]

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: