Este artigo descreve a tecnologia de cache na estrutura do hibernato. Compartilhe -o para sua referência, como segue:
O cache da estrutura do hibernato é dividido no cache da sessão e no cache da sessão, também conhecido como cache de nível 1 e cache de nível 2.
Cache de Nível 1:
O cache de nível 1 é um cache no nível da sessão, que possui um ciclo de vida curto, corresponde à sessão, é gerenciado pelo Hibernate e é um cache em toda a transação. Quando o programa chama o método de carregamento da sessão (), método get (), salvar (), método saveorupdate (), método update () ou interface de consulta, hibernate cache o objeto da entidade; Quando o objeto da entidade é consultado através do método load () ou get (), o hibernato primeiro consultará o cache. Somente quando o objeto da entidade não puder ser encontrado, o Hibernate emitirá instruções SQL para consultar o banco de dados, melhorando assim a eficiência do uso de Hibernate.
Por exemplo:
pacote com.xqh.util; importar org.hibernate.session; import com.xqh.model.user; public class Test {public static void main (string [] args) {sessão session = null; tente {session = hibernateutil.getSession (); // Get Sessionssion.BegIntransaction (); // Ativar transação System.out.println ("First Query:"); User user = (User)session.get(User.class, new Integer(1));System.out.println("Username:" + user.getName());System.out.println("Second Query:");User user1 = (User)session.get(User.class, 1);System.out.println("Username:" + user1.getName());session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();// An error will roll back the transaction session.getTransaction().rollback();} finally {// Close the Session object HibernateUtil.closeSession(session);}}}Quando o programa verifica primeiro o objeto do usuário através do método get (), o Hibernate emitirá uma instrução SQL para consultar. No momento, o Hibernate executa um cache de primeiro nível em seu objeto de usuário; Ao consultar o método get () novamente, o Hibernate não emitirá uma instrução SQL porque o nome de usuário já existe no cache de primeiro nível. Resultados em execução do programa:
Primeira Query: Hibernate: SelectUser0_.id como id0_0_, user0_.name como name0_0_, user0_.sex como sex0_0_ detb_user_info user0_ whereuser0_.id =? Nome de usuário: xqsecond Query: username: xqh
Nota: O ciclo de vida do cache de primeiro nível corresponde à sessão e não é compartilhado entre as sessões. Em sessões diferentes, os objetos da entidade em cache em outras sessões não podem ser obtidos.
Cache de Nível 2:
O cache de segundo nível é um cache de nível de sessão e seu ciclo de vida é consistente com o SessionFactory. O cache secundário pode ser compartilhado entre várias sessões e é um cache em todo o processo ou em todo o cluster.
O Cache do Nível 2 é um plug-in de cache flash e seu uso requer o suporte de produtos de cache de terceiros. Na estrutura do hibernato, a política de uso do cache secundário é configurada através do arquivo de configuração de hibernato.
1. Adicione o arquivo de configuração do cache ehcache.xml
<ehcache> <! - define o caminho para o diretório em que os arquivos de cache .datos são criados. Path = "java.io.tmpdir"/> <!-Configuração de cache padrão. Eles serão aplicados a caches criados programamente através do Cachemanager. Os seguintes atributos são necessários para o DefaultCache: MaxinMemory - define o número máximo de objetos que serão criados no Memoryeternal - define se os elementos são eternos. Se eterno, os tempos limites são ignorados e o elemento nunca expirou.TimeToidleSeconds - define o tempo para ocioso para um elemento antes de expirar. É usado apenas se o elemento não for eterno. O tempo ocioso está agora - o último timetimetoliveSegunds acessado - define a hora de viver para um elemento antes de expirar. É usado apenas se o elemento não for eterno. O TTL é agora-Criação TimeOverflowTodisk-Define se os elementos podem transbordar para o disco quando os caches da memória atingiram o limite maxinmemory. Adicione suas configurações de cache aqui. Se você não tiver uma configuração para o seu cache, um aviso será emitido quando o TheCachemanager iniciar os seguintes atributos forem necessários para o DefaultCache: Nome - Define o nome do cache. Isso é usado para identificar o cache. Deve ser único.MaxinMemory - Define o número máximo de objetos que serão criados no Memoryeternal - define se os elementos são eternos. Se eterno, os tempos limites são ignorados e o elemento nunca expirou.TimeToidleSeconds - define o tempo para ocioso para um elemento antes de expirar. É usado apenas se o elemento não for eterno. O tempo ocioso está agora - o último timetimetoliveSegunds acessado - define a hora de viver para um elemento antes de expirar. É usado apenas se o elemento não for eterno. O TTL é agora-Criação TimeOverflowTodisk-Define se os elementos podem transbordar para disco quando os caches da memória atingiram o limite MaxinMemory .--> <!-O cache de amostra denominado amostragem de sampache1, por mais de 5 minutos, que é mais de 10 minutos para mais de 5 minutos, se houver um elemento mais de que mais de 5 minutos, se houver mais de 5 minutos para mais de 5 minutos. que nesta configuração irá para onde java.io.tmp estiver definido no seu sistema. Em um sistema Linux padrão, este será /tmp "-> <cache name =" samplecache1 "maxElementsInmemory =" 10000 "eternal =" false "timeToidleSeconds =" 300 "timetoliveSewesends =" 600 "Overflowtodisk =" " /> <!-amostra de cache denominada Smplects Smplecthe. expirado.
2. Defina o arquivo de configuração do hibernato.
<!-Ativar cache de nível 2-> <propriedade name = "hibernate.cache.use_second_level_cache"> true </ouse> <!-especifique o provedor de produtos do cache-> <propriedades name = hibernate.cache.provider_class "> org.hibernate. USAGE = "somente leitura"> </Class-Cache>
exemplo:
pacote com.xqh.util; importar org.hibernate.session; import com.xqh.model.user; public class Test {public static void main (string [] args) {sessão session = null; // First SessionStry {session = HibernateUtil.getSession (); session.BegIntransaction (); System.out.println ("First Query:"); User User = (User) session.get.get.class, 1); {E.PrintStackTrace (); // Um erro reverte a transação session.gettransaction (). rollback ();} finalmente {// fechar o objeto de sessão hibernateutil.closSession (session);} tente {session = hibernateutil.getSession (); // Ative o segundo cache session.begIntransaction (); System.out.println ("Segunda Query:"); User User = (User) session.get (user.class, 1); System.out.println ("Username:" + user.getname);); session.PRANSACION (). Commit (); a transação session.gettransaction (). rollback ();} finalmente {// fecha o objeto de sessão hibernateutil.clossession (session);}}}O cache secundário é compartilhado entre as sessões; portanto, o mesmo objeto pode ser carregado em sessões diferentes. O Hibernate emitirá apenas uma instrução SQL. Quando o objeto é carregado na segunda vez, o Hibernate recebe esse objeto do cache.
Resultados do programa:
Primeira Query: Hibernate: SelectUser0_.id como id0_0_, user0_.name como name0_0_, user0_.sex como sex0_0_ detb_user_info user0_ whereuser0_.id =? Nome de usuário: xqsecond Query: username: xqh
Para o cache L2, alguns dados atualizados com pouca frequência ou dados referenciados podem ser usados, e seu desempenho será significativamente melhorado no momento. No entanto, se os dados frequentemente alterados forem usados para o cache L2, o desempenho causará certos problemas.
Espero que a descrição deste artigo seja útil para a programação Java de todos com base na estrutura do Hibernate.