Prevayler

Fala galera…

to vendo em varios lugares esse tal de Prevayler…

o q vem a ser isso?? ele tem o proposito de acabar com os banco de dados convencionais?? como ele funciona??

alguem poderia dar uma luz?? ou quem sabe, fazer um pequeno tutorial aqui p/ galera…

valew

1 curtida

fale com o carlos Villella, o cv. Ele está envolvido no projeto. E no JustJava houve uma palestra (bem interessante) sobre o Prevayler. O site do projeto é esse: www.prevayler.org/ .

Opa, iai Baroni! Não sei se vc foi ao JustJava e assistiu às palestras ou falou com o pessoal do Prevayler no estande, mas, colocando de forma bem curta-e-grossa, o Prevayler, como banco de dados ou mecanismo de persistência, é uma farsa.

Mas, por que o Prevayler é uma farsa? :shock:

:!: Não tem linguagem de queries
:!: Não faz persistência de objetos
:!: Não tem índices
:!: Não tem mais um monte de coisa

“Então, como um projeto desses pode se atrever a querer acabar com os bancos de dados?”, voce pergunta. Uma questão bem válida, depois de descobrir que o Prevayler é uma farsa. Mas, então, como o Prevayler funciona? :?

  • Linguagem de Queries: qualquer linguagem plugavel numa app Java que suporte navegacao num grafo de objetos (XPath, OQL, SODA, Jython, e por aí vai) :wink:

  • Persistência de Objetos: qualquer mecanismo de serialização compatível em API com a serialização do Java :wink:

  • Índices: HashMap, TreeMap ou qualquer outra collection é um índice 8)

Mas, então, o que o Prevayler faz? Ele permite que as mudanças a seus objetos de negócio sejam persistidas transparentemente, e recuperadas ao reiniciar a aplicação, serializando as mudanças em sequência, e reaplicando estas em ordem, ao reiniciar. Opcionalmente, para evitar que o log de transações fique muito grande, você pode tirar ‘snapshots’ do sistema periodicamente (à noite, por exemplo).

“Só? :o”

Yeap. Só. Mas esse “só” Teve um tom meio curioso, não teve? Pois bem: “só” isso já é mais do que suficiente pra te permitir criar sistemas com persistência transparente, com liberdade total para brincar à vontade com as APIs de querying que você gostar mais (ficando livre do SQL, inicialmente, até que alguém implemente SQL para objetos Java, ou OQL, ou o que for). Você também fica livre de usar uma conexão de rede, muitas vezes lenta, com seu banco de dados, o que te dá uma performance absurda (alguns testes indicaram que queries num sistema usando Prevayler foram 9000 vezes mais rapido que o Oracle EM RAM :shock:).

O único “problema” do Prevayler é que ele só funciona legal quando todos os seus objetos cabem na RAM, mas, se vc parar pra pensar bem, na grande maioria das aplicações, eles cabem (já parou pra pensar quanta informação tem em 256mb? E que nem 5% dos sistemas usa tanta informação assim?). Se as suas aplicações fazem parte dessa minoria, então o Prevayler ainda não é pra você - vai ser necessário esperar algum tempinho até que a RAM se torne ainda mais barata, e vai ser pouco tempo, acredito.

Aqui vão alguns links caso vc queira saber mais sobre o Prevayler:

:arrow: Homepage: http://www.prevayler.org
:arrow: SourceForge: http://prevayler.sf.net
:arrow: Meu artigo na dW: http://www-106.ibm.com/developerworks/web/library/wa-objprev/index.html

uau…
q explicacao cv…hehe

valew pela dica…vou tentar me aprofundar mais no assunto…parece ser uma boa ideia o Prevayler…

ate mais…

E qto a segurança reais dos dados?? é realmente confiável??

Engraçado… será mesmo que os bancos serão extintos?? Tipo… ja tem gente usando XML como forma de evitar BDs em alguns casos e tal… E agora esse tal de Prevayler tbm…
Eu gostaria que você me dissesse uma vantagem diferencial entre esse “Prevayler” e um BD como Oracle mesmo… Apesar que ja li as mensagens acima… Porém de qquer forma gostaria de algo + satisfatório… Desculpe me por qualquer inconveniencia…

Claro! Por que vc nao faz alguns testes e ve com seus proprios olhos? :slight_smile:

Os bancos de dados relacionais nunca serão extintos, pq pra muitas áreas eles são interessantes. O modelo relacional tem sido modificado e evoluido ao longo das ultimas decadas, e com certeza vai melhorar ainda mais. O que deve, mesmo, ser extinto é o uso indiscriminado de bancos de dados para soluções que poderiam ser melhor implementadas usando outras tecnologias (XML, Prevayler, etc). Eu de forma alguma sou “contra” bancos de dados, mas todos temos de concordar que fazer mapeamento Objeto-Relacional é um pé no saco, e trabalhar diretamente com SQL dentro do código beira o ridículo hoje em dia. Para os casos onde isto não é necessário, agora temos o Prevayler :smiley:

O que seria algo mais satisfatório que um desempenho de queries em torno de 9000 vezes maior que um banco de dados Oracle 9i CARREGADO EM RAM? Persistência de objetos de negócio transparente, talvez? Ou o fato de nunca ninguém ter encontrado um bug no core do Prevayler? :slight_smile:

Todo caso, se você quiser se convencer de verdade, não vai adiantar nada eu ficar aqui escrevendo laudas e laudas. O Prevayler é free! Baixe, instale e rode os testes e demos! Garanto que, mesmo que você não venha a trabalhar com o Prevayler num curto espaço de tempo, ficará, no mínimo, impressionado com a elegância da idéia :slight_smile:

O cv, tem mais alguma documentação a respeito do prevayler em algum outro lugar, eu baixei ele, mas não sei como instalar.

Qual versao do Prevayler vc baixou? Se foi a 1.x, então é só compilar com o ANT. Aliás, dê uma olhada nos targets do ANT, a maioria dos exemplos pode ser rodada de forma bem facil usando o buildfile.

o prevayler é 1 grande sacada, mas sofre de algumas deficiencias graves:

-Voce tem que escrever os comandos, isso é tedioso e sucetivel a bugs, o prevayler é tão seguro quanto o pior dos comandos usados com ele, ou seja, é muito mais sucetivel a erros de programação. Um RDBMS nao tem esse problema, uma query nao deixa o banco em estado inconsistente.

-Com prevayler voce é muito mais refem do hardware que com bancos de dados normais. Uma vez que ele usa serialização do java que falha miseravelmente quando ocorre falhas em disco. Ou seja, pode puxar a tomada a vontade, mas quando 1 cluster com defeito e teu log é inutilizado por completo a partir dele, uim bom banco de dados consegue superar isso ate certo ponto.

-Prevayler é ideal para aplicações single threaded, já que todas modificações são executadas em serie, nao importa se voce tem 1 ou 100 cpus.

Por ultimo, apenas uma critica contra a metodologia dos benchmarks.
Nele o autor compara ‘apples to oranges’ pq compara 2 ambientes diferentes. Pouco injusto rodar o banco em um processo separado.

Oque eu gostaria de ver era algum benchmark contra 1 MySQL embedded usando HEAP tables.

O Oracle possui uma JVM emdedded nao? Pq nao rodar os testes dali?

Acho que o CV pode explicar melhor essa, mas eu já vou te dar uma sugestão: se vc vai usar multithreads, vc tem que fazer sozinho a sua concorrência. De cara. Como se vc tivesse RAM infinita.

Você só garante exclusão mútua no banco para o acesso aos dados. Se você guardar objetos java mapeados no banco (JDO ou sei lá), e quiser instanciá-los, o banco não pode fazer nada por você.

Mais do que isso, como é aberto, é bem mais configurável. Vc pode ter diversos Mutexes, por exemplo, pra fazer exclusão mútua em grupos de objetos disjuntos… vc pode rodar transações em paralelo, desde que elas não escrevam nos mesmos objetos.

Vc pode, aliás, fazer seus Commands tão restritos quanto vc queira, manipular a justiça (justiça no sentido técnico), por exemplo, beneficiando as transações de leitura. E implementar “subclasses” de transações que, além do padrão de acesso (leitura/escrita), observam se a transação cria um objeto ou não e fazer outra política de justiça baseada nisso.

Mais ainda, vc não precisa mais de rollback!!! Vc pode garantir que uma transação vai ter sucesso, de várias formas:

  1. fazendo uma cópia e testando (força bruta, eu diria).
  2. garantindo que os recursos necessários estão lá. Lembre-se que suas classes de negócio são determinísticas…
  3. adquirindo locks, vc pode garantir que os objetos que vc utiliza naquela transação não serão modificados durante a execução, e assim vc garante VALORES.

Vc não precisa nem de triggers!! É como se todos os acessos ao seu banco fossem feitos através de stored procedures, sua liberdade é total.

O caso do disco é mesmo grave. Mas se vc tem um sistema crítico, que não pode cair de jeito nenhum (esse é o alvo principal do prevayler), não custa muito ter 2 máquinas, uma “chefe” e uma réplica, rodando o seu sistema.

Foi mal pelo tamanho, me empolguei…

[]s!!

Ae galera…

Quais são as maiores mudanças do Prevayler v1.x para o Prevayler 2???

Tbém achei super-elegante o modelo de persistencia dele…
Mas pq o projeto opta por manter os objetos em RAM???
Velocidade de acesso???

[quote=“louds”]o prevayler é 1 grande sacada, mas sofre de algumas deficiencias graves:
[/quote]

Nada é perfeito !!!

Vc está 100% certo, mas isso depende do ponto de vista e do gosto do freguês. Escrever SQL tb pode ser tedioso, e se vc não fizer isso direito vai detonar o seu banco. Uma query fazendo full table scan ou um update errado vai detonar o seu banco ou apagar os seus dados. O legal do Prevayler é que vc pode ter uma biblioteca de comandos pré-definidos e apenas reutilizá-los.

Não sou expert no assunto, mas pra isso que serve back-up. No Oracle tb se vc tem um bad block no HD, vc começa a receber ORA Corrupted. A vantagem do Oracle é que a coisa é particionada, logo vc não perde tudo. No prevayler tb… Os comandos são particionados em vários arquivos diferentes. Perder tudo tb vai ser difícil.

Não entendi porque isso seria uma desvantagem. Outros programas rodando na máquina vão ficar felizes se houver outro processador.

Esses benchmarks são interessantes mas ninguém vai tomar a decisão de usar o prevayler por causa deles. Os problemas do prevayler são outros que não tem nada a ver com velocidade.

Quem quiser dar uma olhada numa implementação simples e eficiente de um sistema de persistencia (ou prevalencia) pode visitar a página:

http://www.smartjava.com.br/artigo3.jsp

Um abraço,

Sergio Oliveira
www.smartjava.com.br