当前位置:首页 > Web开发 > 正文

先从一级缓存当中查询

2024-03-31 Web开发

标签:

Hibernate缓存机制 什么是缓存,为什么需要缓存?

什么是缓存? 存在内存中的姑且数据

为什么需要缓存? 减少措施直接和数据库交互的次数,因为直接交互的功效集很多都是反复的,例如盘问,缓存可以减少开销

什么样的数据适合缓存?什么样的数据不适合缓存?

适合缓存的数据 多次盘问且很少次改削,同时改削了之后对功效的影响不大的数据

不适合缓存的数据 并发访谒的数据必然不能被缓存

Hibernate一级缓存验证

Hibernate一级缓存指的是Session东西的缓存,一旦Session东西销毁了,一级缓存也就消掉了,下面代码证明了一级缓存的存在:

@Test public void test2(){ Configuration cfg = new Configuration(); cfg.configure(); SessionFactory factory = cfg.buildSessionFactory(); Session session = factory.openSession(); Transaction tx = session.beginTransaction(); //第一次盘问,盘问功效放到了一级缓存傍边 User user1 = (User) session.get(User.class, 95L); //第二次盘问,先从一级缓存傍边盘问,有的话拿过来直接用,没有的话向数据库盘问 User user2 = (User) session.get(User.class, 95L); System.out.println(user1); System.out.println(user2); tx.commit(); session.close(); factory.close(); }

运行的功效如下:

Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.birthday as birthday0_0_ from user user0_ where user0_.id=? [email protected] [email protected]

可以看到,确实在一次盘问且Session没有被封锁的情况下,Hibernate只向数据库盘问了一次

Hibernate一级缓存的道理

技术图片

Hibernate首先按照类的class字节码字符串来使盘问映射到一个Map东西,这个Map东西的key是OID(Object ID),value是Object,由此可得到一级缓存的事情道理。

然而一级缓存还有一个快照区域,用来生存盘问出来的东西数据,若快照区域的东西和一级缓存中的Session东西不一致的时候,会触发更新数据库的操纵update()

Hibernate东西的四种状态

瞬时状态(姑且状态) 没有OID,和Session没有关系

长期状态 有OID,和Session有关系,只有长期化状态的东西才有一级缓存!!!!!

游离状态(托管状态) 有OID,与Session不妨

删除状态 有OID,和Session有关系,但是挪用了删除的要领,但是事务还没有提交,此时为删除态

技术图片

Hibernate二级缓存

SessionFactory级另外二级缓存是全局性的,所有的Session可以共享这个二级缓存。不过二级缓存默认是封锁的,需要显示开启并指定需要使用哪种二级缓存实现类(可以使用第三方供给的实现)。一旦开启了二级缓存并设置了需要使用二级缓存的实体类,,SessionFactory就会缓存访谒过的该实体类的每个东西,除非缓存的数据超过了指定的缓存空间。

一级缓存和二级缓存都是对整个实体进行缓存,不会缓存普通属性,如果但愿对普通属性进行缓存,可以使用盘问缓存。盘问缓存是将HQL或SQL语句以及它们的盘问功效作为键值对进行缓存,对付同样的盘问可以直接从缓存中获取数据。盘问缓存默认也是封锁的,需要显示开启。

Hibernate缓存机制

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31310.html