缓存机制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.1、缓存策略
3.1.1、一级缓存
之前每一个数据库操作都是一个Session,那么对于Session来说本身是存在着缓存,可以保留之前的查询结果。
但是对于Session的缓存只针对于一个Session有效,那么如果现在想针对于多个Session 有作用,则必须在SessionFactory上配置缓存,那么这样的缓存称为二级缓存。
在Hiernate按ID查询有两个方法:load、get
那么下面使用以上的查询方法,查询两次
程序虽然调用了两次load方法,但是只发出了一条的查询命令,证明,第一次的查询结果被保存下来了,那么这就是一级缓存。
与之前的相比,查询了两次操作,所以此时,证明一级缓存只是针对于一个Session起作用的。但是一级缓存是无法关闭的,始终会存在。
从运行结果可以发现,如果之前先进行了保存操作,那么之后再查询的话也不会重新发出查询语句。证明实体被缓存下来。
问题:
如果现在要求使用程序插入100000万条记录?该怎么办?
如果使用Hibernate处理的话,则可能会出现内存的溢出,所以在这种情况下首先是绝对不建议使用Hibernate完成的,就使用最基本的JDBC操作完成即可。
如果非要使用Hibernate做,则必须使用到Session中关于缓存的一些操作方法:·清空Session中的所有缓存:clear()
·清空Session中一个指定的实体:evict(Object obj)
例如:下面验证clear()方法
因为程序中,将所有的缓存清空了,所以之后再查询相同实体的时候,在Session中已
以上因为只清空了一个实体,所以只发出了三个查询语句。
那么就可以通过以上的方式完成100W条记录的插入
思路:按照每十条清空缓存的操作,并将缓存中的内容强制性的写到数据库之中
3.1.2、二级缓存(重点)
在Hibernate本身中支持了多种的二级缓存组件。本次使用EHcache。如果要想使用ehcache话,则首先必须进行配置,配置ehcache的缓存文件。
ehcache.xml:
如果要想在Hibernate之中启动二级缓存,则必须在hibernate.cfg.xml中配置缓存。
程序中出现了两个session对象,之前没有配置二级缓存的时候查询了两次,现在再观
从以上代码中可以发现,程序只发出了一条查询语句,而第二条不再执行,因为缓存是在SessionFactory上配置出来的,是所有session共享的。
当然,在SessionFactory中也是可以清除掉缓存内容的,但是里面不存在clear()方法,只能单独删除一个缓存的实体。
二级缓存如果不想直接在*.hbm.xml中配置,也可以直接在hibernate.cfg.xml中配置。
3.1.3、缓存交互
在缓存中,实际上一级缓存是可以向二级缓存中写入内容的,例如:有一个session把自己的实体变为共享实体,如果要想实现此种操作,则可以在查询的时候,设置缓存的模式,模式设置方法:
·setCacheModule()方法
缓存的模式有以下几种:
·CacheMode.NORMAL - 从二级缓存中读、写数据。
·CacheMode.GET - 从二级缓存中读取数据,仅在数据更新时对二级缓存写数据。
·CacheMode.PUT - 仅向二级缓存写数据,但不从二级缓存中读数据。
·CacheMode.REFRESH - 仅向二级缓存写数据,但不从二级缓存中读数据。通过e_minimal_puts的设置,强制二级缓存从数据库中读取数据,刷新缓存内容。
例如:以下代码验证了缓存的交互模式
以其查询出来的实体并没有放到缓存之中,如果没有放的话,则第二个session对象读取的时候就只能重新发出查询语句。
3.1.4、查询缓存
保留一条查询语句,如果重复出现多次查询的话,不会向数据库中发出重复的查询命令。
如果要想配置查询缓存,则必须在hibernate.cfg.xml中进行配置,表示启动查询缓存。
启用之后,在Query对象之中,设置一个setCacheable(true)就表示把此查询语句保存下来了。