hibernate session的一级缓存,二级缓存以及查询缓存

一级缓存:
Session session = HibernateUtil.currentSession();
Transaction transaction = session.beginTransaction();
先使用session的get方法查询一下对象,查询完毕之后此对象保存在session一级缓存中
如果以后还有session的get方法去数据库中查询,那么先查询session一级缓存如果一级缓存中没有
此对象那么session就会去数据库中找;
有这个session一级缓存的好处是:
如果查询一下去就和数据库连接一次,太浪费资源,所以session查询出来的对象都会
保存在一级缓存中,如果再用session查的话就会现查缓存,如果缓存中有那么就不去数据库中啦
直接使用缓存中的,如果没有就去数据库中查,数据库中查一次hibernate就会打印一次sql语句;
如果从session一级缓存中查那么就不用sql语句;
如果在第二次查询之前把第一次查询的对象从session一级缓存中清楚啦那么,第二次查询,在session一级缓存中就找不到这个对象啦就会去数据库中查;
所以如果再session一级查询缓存中找到对象啦就会打印一条sql语句;
User user = (User)session.get(User.class, 1);
session.evict(user);
session.get(User.class, 1);
System.out.println();
transaction.commit();
HibernateUtil.closeSession();
二级缓存:
二级缓存储存在sessionfactory中;
二级缓存需要的架包和环境搭建有:
架包:ehcache-1.2.3.jar和commons-logging.jar;
环境搭建:hibernate.cfg.xml中配置:
开启二级缓存
<property name="hibernate.cache.use_second_level_cache">true</property>
二级缓存供应商
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
*.hbm.xml中配置:
指定二级缓存的持久化类,usage:指定类型
<cache usage="read-only"/>
随着session关闭的一级缓存也就不存在啦,但可以在二级缓存中找,二级缓存在sessionFactory中,如果使用
sessionFactory的opSession()方法再次获取session那么,就可以从二级缓存中查找,可以像一级缓存一样的节省资源;
Session session = sessionFactory.openSession();
User user = (User) session.get(User.class, 1);
System.out.println(user.toString());
session.close();
Session session2 = sessionFactory.openSession();
User user2 = (User) session2.get(User.class, 1);
session2.close();
查询缓存:
查询缓存得建立在二级缓存之上;
查询缓存用的环境:
hibernate.cfg.xml配置:
<property name="hibernate.cache.use_query_cache">true</property>
使用query的setCacheable(boolean)方法如果参数为true那么查询的时候经过查询缓存,如果参数为false查询的时候不经过查询缓存直接查询,这个查询缓存也可以实现一级缓存的效率;
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
String hql = "from User"; ** sql语句
Query query = session.createQuery(hql); ** 执行sql语句
List<User> list = query.setCacheable(true).list(); ** 使用查询缓存,第一次查询完的对象保存到查询缓存中;
for (User user : list) {
System.out.println(user.toString());
}
session.close();
Session session2 = sessionFactory.openSession();
String hql2 = "from User";
Query query2 = session2.createQuery(hql2);
List<User> list2 = query2.setCacheable(true).list();
for (User user : list2) {
System.out.println(user.toString());
}
缓存:
计算机的一个概念,介于应用程序和永久性数据储存源之间
作用:
降低应用程序直接读取永久性数据存储源的频率,从而提高啦应用的运行性能;
缓存中的数据,是数据存储源中数据的复制,应用程序在运行时直接读取缓存中的数据,只是在某些特定的时刻按照缓存中的数据来同步更新数据存储源;
Hibernate的缓存一般分为3类:
1.一级缓存:
Session缓存称为一级缓存,由于session对象的生命周期通常对应一个数据库事务;
因此他的缓存是事务范围的缓存;
一级缓存是必须的
在一级缓存中,持久化类的每一个实例都是具有唯一的OID(对象标识符)
2.二级缓存:
SessionFactory缓存分为内置缓存和外置缓存
内置缓存:
Hibernate自带的,不可拆卸的,是只读缓存,用来存放映射元数据和sql语句;
外置缓存:
可配置的缓存插件,默认sessionFactory不会启动这个缓存插件,外置缓存中的数据是数据库数据的复制SessionFactory的外置缓存成为Hibernate二级缓存,二级缓存由SessionFactory管理
3.查询缓存:
Hibernate为查询结果提供的依赖于二级缓存;
缓存的作用范围分为3类:
1.事务范围:
每个事务都有自己的缓存,缓存内的数据不会被多个事务并发访问
2.进程范围:
进程内的所有事务共享缓存,进程结束,缓存结束生命周期
3.集群范围:
缓存被一个或者多个机器上的多个进程共享
查询性能优化:
1.使用迫切左外连接或迫切内连接查询策略,查询缓存等方式;
减少select语句的数目,降低访问数据库的频率;
2.使用延迟策略等方式避免加载多余的不需要访问的数据库;,使用load()方法和iterate()方法;
3.使用Query接口的iterate()方法减少select语句中的字段,从而降低访问数据库的数据量
序列化和反序列化:
序列化:
处理对象流(将创建的对象,进行流化操作,即变成二进制数据,方便传递使用)
作用:
1.用于数据的读写操作(不是必须的)
2.用于网络之间的数据传输操作(必须进行序列化)
效果:
实现接口Serializeble的同时序列化会自动进行调用和流化操作,生成序列化id(唯一),相当于此序列化的身份证;
反序列化:
读取二进制流信息,通过序列化id,来找到相对应的序列化对象;
本文章是作者自己总结,如果有什么不足之处,请评论,谢谢















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值