Quais são os caches de primeiro e segundo nível no Hibernate?

245

Alguém pode explicar em palavras simples o que é o cache de primeiro e segundo nível no Hibernate?

suhair
fonte

Respostas:

300

1.1) Cache de primeiro nível

O cache de primeiro nível sempre se associa ao objeto Session . O Hibernate usa esse cache por padrão. Aqui, ele processa uma transação após outra, significa que não processará uma transação várias vezes. Principalmente, reduz o número de consultas SQL necessárias para gerar em uma determinada transação. Ou seja, em vez de atualizar após todas as modificações feitas na transação, ele atualiza a transação apenas no final da transação.

1.2) Cache de segundo nível

O cache de segundo nível sempre se associa ao objeto Session Factory . Durante a execução das transações, ele carrega os objetos no nível do Session Factory, para que esses objetos estejam disponíveis para o aplicativo inteiro, não vinculados ao usuário único. Como os objetos já estão carregados no cache, sempre que um objeto é retornado pela consulta, nesse momento não é necessário fazer uma transação do banco de dados. Dessa maneira, o cache de segundo nível funciona. Aqui também podemos usar o cache no nível da consulta.

Citado em: http://javabeat.net/introduction-to-hibernate-caching/

Dennis C
fonte
38
+1 para mapeamento de cache de primeiro nível com objeto de sessão e cache de segundo nível com objeto de fábrica de sessões. eu nem precisava continuar lendo.
Mahes
1
Cache de 1º nível. na maioria dos casos, não é necessário, mas não há opção para se livrar dele. mas você deve pensar sobre isso o tempo todo ..
ses
6
@ses Você precisará de um cache de primeiro nível na maioria dos casos. Caso contrário, você terá um problema MAU DE DESEMPENHO, como consulta N + 1, ou nenhum cache de pré-busca, ou consulta uma vez sempre que acessar um atributo.
Dennis C
Geralmente usamos a sessão por um período muito curto [e muito recomendado pelo corpo] / sessão de curta duração: nem usamos esse cache nesse período. se a sessão tiver vida longa, desconectamos os dados (ao editar o formulário, por exemplo) da sessão. Parece que é necessário apenas para um cenário quando tentamos usar a query-session-api enquanto construímos algumas solicitações e solicitações complexas para uma sessão de longa duração.
S3 /
1
@DennisCheung: O link está morto. Por favor, atualize com javabeat.net/introduction-to-hibernate-caching
NewUser
118

Há uma boa explicação do cache de primeiro nível no blog Streamline Logic .

Basicamente, o cache de primeiro nível ocorre por sessão, onde o cache de segundo nível pode ser compartilhado em várias sessões.

lomaxx
fonte
20
isso é simples palavras ali mesmo, eu não sei por que eles têm essa dificuldade em explicar isso
BlackTigerX
hehe ... sim, eu realmente não sei como eu poderia ter ficado muito mais simples :)
lomaxx
2
isso na verdade é mais claro para mim. o primeiro é por sessão, enquanto o segundo é para várias sessões, é simples para mim ter em mente. Não podemos votar duas vezes? : D
black sensei
1
não há exemplos de por que o cache do 1º nível é necessário. quanto a mim, na maioria dos casos, não é necessário. mas você deve pensar nisso e na sessão o tempo todo.
ses
Seus 11 anos desde essa resposta e infelizmente o link não existe agora. Mas eu achei o seu conteúdo em sua página de arquivo: web.archive.org/web/20081207044228/http://...
Golu
105

Aqui estão algumas explicações básicas do cache de hibernação ...

O cache de primeiro nível está associado ao objeto "sessão". O escopo dos objetos de cache é de sessão. Depois que a sessão é fechada, os objetos em cache desaparecem para sempre. O cache de primeiro nível está ativado por padrão e você não pode desativá-lo. Quando consultamos uma entidade pela primeira vez, ela é recuperada do banco de dados e armazenada no cache de primeiro nível associado à sessão de hibernação. Se consultarmos o mesmo objeto novamente com o mesmo objeto de sessão, ele será carregado do cache e nenhuma consulta sql será executada. A entidade carregada pode ser removida da sessão usando o evict()método O próximo carregamento desta entidade fará novamente uma chamada ao banco de dados se ela tiver sido removida usando o evict()método Todo o cache da sessão pode ser removido usando o clear()método Ele removerá todas as entidades armazenadas no cache.

O cache de segundo nível é separado do cache de primeiro nível, disponível para uso global no escopo da fábrica de sessões. o cache de segundo nível é criado no escopo da fábrica de sessões e está disponível para uso em todas as sessões criadas usando essa fábrica de sessões específica. Isso também significa que, uma vez que a fábrica de sessões é fechada, todo o cache associado a ela morre e o gerenciador de cache também é fechado. Sempre que a sessão de hibernação tenta carregar uma entidade, o primeiro local em que ela procura a cópia em cache da entidade no cache de primeiro nível (associado a uma sessão de hibernação específica). Se a cópia em cache da entidade estiver presente no cache de primeiro nível, ela será retornada como resultado do método de carregamento. Se não houver uma entidade em cache no cache de primeiro nível, o cache de segundo nível será procurado para a entidade em cache. Se o cache de segundo nível tiver uma entidade em cache, ele será retornado como resultado do método de carregamento. Mas, antes de retornar a entidade, ele é armazenado no cache de primeiro nível também, para que a próxima invocação para carregar o método da entidade retorne a entidade do próprio cache de primeiro nível e não seja necessário ir novamente para o cache de segundo nível. Se a entidade não for encontrada no cache de primeiro nível e também no cache de segundo nível, a consulta ao banco de dados será executada e a entidade será armazenada nos dois níveis de cache, antes de retornar como resposta deload() método.

Crédito para
fonte
2
Excelente explicação! Se você pudesse desenhar alguns diagramas de sequência, será incrível !!!
217 Adelin
completa e boa explicação
ManishS
1
Se você deseja revisar o que já sabe, as duas respostas acima, de Dennis C e Iomaxx, são ótimas, muito sucintas e fáceis de lembrar. Se, no entanto, você estiver procurando uma explicação da diferença quando ainda não a conhece, essa resposta é muito melhor!
A Alma Student
Ótima explicação !!
precisa saber é
17

Esta é uma pergunta muito comum, portanto, esta resposta é baseada neste artigo que escrevi no meu blog.

Cache de primeiro nível

O Hibernate tenta adiar o contexto de persistência até o último momento possível. Como expliquei neste artigo , essa estratégia é tradicionalmente conhecida como write-behind transacional.

O write-behind está mais relacionado à liberação do Hibernate do que a qualquer transação lógica ou física. Durante uma transação, a liberação pode ocorrer várias vezes.

insira a descrição da imagem aqui

As alterações liberadas são visíveis apenas para a transação do banco de dados atual. Até que a transação atual seja confirmada, nenhuma alteração será visível por outras transações simultâneas.

Devido ao cache de primeiro nível, o Hibernate pode fazer várias otimizações:

Cache de segundo nível

Uma solução de cache adequada teria que se estender por várias sessões do Hibernate, e é por isso que o Hibernate também suporta um cache de segundo nível adicional.

O cache de segundo nível está vinculado ao ciclo de vida do SessionFactory, portanto, é destruído apenas quando SessionFactoryé fechado (normalmente quando o aplicativo está sendo desligado). O cache de segundo nível é orientado principalmente para a entidade, embora também suporte uma solução opcional de cache de consultas.

Para mais detalhes, consulte este artigo .

Vlad Mihalcea
fonte
3

Por padrão, o NHibernate usa o cache de primeiro nível, que é baseado em Objeto de Sessão. mas se você estiver executando em um ambiente com vários servidores, o cache de primeiro nível poderá não ser muito escalonável, além de alguns problemas de desempenho. isso acontece devido ao fato de que ele precisa fazer viagens muito frequentes ao banco de dados, pois os dados são distribuídos por vários servidores. em outras palavras, o NHibernate fornece um cache L1 básico em processo não tão sofisticado pronto para uso. No entanto, ele não fornece recursos que uma solução de cache deve ter para ter um impacto notável no desempenho do aplicativo.

portanto, a questão de todos esses problemas é o uso de um cache L2 associado aos objetos de fábrica de sessões. reduz as viagens demoradas ao banco de dados, aumentando o tempo de resposta do aplicativo.

Ravian
fonte
1

Cache de primeiro nível

O objeto de sessão contém os dados do cache de primeiro nível. Está ativado por padrão. Os dados do cache de primeiro nível não estarão disponíveis para todo o aplicativo. Um aplicativo pode usar muitos objetos de sessão.

Cache de Segundo Nível

O objeto SessionFactory mantém os dados do cache de segundo nível. Os dados armazenados no cache de segundo nível estarão disponíveis para todo o aplicativo. Mas precisamos habilitá-lo explicitamente.

Mais solto
fonte
-4

Em um cache de segundo nível, os arquivos hbm do domínio podem ser mutáveis ​​e ter o valor falso. Por exemplo, nessa classe de domínio, parte da duração de um dia permanece constante como a verdade universal. Portanto, pode ser marcado como imutável em todos os aplicativos.

Prakash Bayas
fonte