java mysql 二级缓存_Java笔记之hibernate(十二):一级缓存和二级缓存

0.说在前面

1.一级缓存

1.1 概念

hibernate默认开启一级缓存,一级缓存是放在session上的.

1.2 新建SessionTest类

packagecom.hibernate.demo.test;importorg.hibernate.SessionFactory;importorg.hibernate.cfg.Configuration;importorg.hibernate.classic.Session;importcom.hibernate.demo.bean.Employee;public classSessionTest {public static voidmain(String[] args) {//加载配置文件,获取会话工厂对象

SessionFactory sessionFactory = newConfiguration().configure().buildSessionFactory();//获取会话对象

Session session1 =sessionFactory.openSession();

Session session2=sessionFactory.openSession();

System.out.println("log1");//根据id获取Employee对象

Employee employee = (Employee) session1.get(Employee.class, 2);

System.out.println("log2");

Employee employee2= (Employee) session1.get(Employee.class, 2);

System.out.println("log3");

Employee employee3= (Employee) session2.get(Employee.class, 2);

System.out.println("log4");//关闭会话对象

session1.close();

session2.close();//关闭会话工厂对象

sessionFactory.close();

}

}

1.3 修改Emplyee.hbm.xml文件,去除Employee与Department的many-to-one关系中的lazy="false"配置,便于查看运行结果

1.4 运行SessionTest类

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

SLF4J: Defaulting to no-operation (NOP) logger implementation

SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

log1

Hibernate: select employee0_.emp_id as emp1_0_0_, employee0_.emp_name as emp2_0_0_, employee0_.dept_id as dept3_0_0_ from t_employee employee0_ where employee0_.emp_id=?log2

log3

Hibernate: select employee0_.emp_id as emp1_0_0_, employee0_.emp_name as emp2_0_0_, employee0_.dept_id as dept3_0_0_ from t_employee employee0_ where employee0_.emp_id=?log4

1.5 总结

从1.4中打印的信息可以看出:

(1)对于同一个Session对象session1来说,由于是第一次根据id去查询Employee对象,还没有缓存信息,所以会发送SQL语句去数据库查询,因此log1与log2之间打印出了发送的SQL信息;当第二次再根据同一个id去获取Employee对象时,由于已经有了缓存信息,所以直接从Session的缓存中获取信息,不再发送SQL去数据库查询,因此log2与log3之间没有打印出发送的SQL信息.

(2)对于不同的Session对象session1和session2来说,缓存信息不共享,所以session2第一次根据同一个id去获取Employee对象,会发送SQL语句去数据库查询,因此log3与log4之间打印出了发送的SQL信息.

2.二级缓存

2.1 概念

(1)hibernate本身不提供二级缓存,都是使用第三方二级缓存插件做支持,这里使用的是EhCache;

(2)二级缓存是作用在SessionFactory上的;

2.2 添加ehcache的jar包,该包是net.sf.ehcache下的---容易下错包

40263ffe98776db0f35e2695def42722.png

2.3 hibernate.cfg.xml配置二级缓存

/p>

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/keeper?characterEncoding=utf-8

root

123456

org.hibernate.dialect.MySQL5Dialect

true

update

true

org.hibernate.cache.EhCacheProvider

2.4 新建ehcache.xml文件,放在src目录下

/>

2.5 修改Employee.hbm.xml文件,添加缓存配置

/p>

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

2.6 运行SessionTest类

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

SLF4J: Defaulting to no-operation (NOP) logger implementation

SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

log1

Hibernate: select employee0_.emp_id as emp1_0_0_, employee0_.emp_name as emp2_0_0_, employee0_.dept_id as dept3_0_0_ from t_employee employee0_ where employee0_.emp_id=?

log2

log3

log4

2.7 总结

从2.6中打印的信息可以看出,只在session1根据id获取Employee对象时发送了SQL去数据库进行查询,session2根据同一个id获取Employee对象时,并没有发送SQL去数据库查询,可见二级缓存起作用了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值