Alguém pode explicar em palavras simples o que é o cache de primeiro e segundo nível no Hibernate?
fonte
Alguém pode explicar em palavras simples o que é o cache de primeiro e segundo nível no Hibernate?
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/
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.
fonte
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 oevict()
método Todo o cache da sessão pode ser removido usando oclear()
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 de
load()
método.fonte
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.
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 .
fonte
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.
fonte
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.
fonte
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.
fonte