【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示
来源:互联网 发布:python 扑克 编辑:程序博客网 时间:2024/05/22 10:29
网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要进入商品的详细信息页面,就像淘宝里面那样。那么每次点击都要去后台查询一下该商品的详细信息,就会发送相应的sql语句,每次刷新一下详细页面也会发sql语句,这样的话,性能肯定会受到很大的影响。那么使用hibernate的二级缓存就可以解决这个问题。
有些人可能会想,我们可以使用重定向,这样的话,在用户第一次访问的时候把信息查出来放到session中,以后每次用户刷新就可以去session中拿了,这样就不用去数据库中查询了,这是有道理的,但是不能解决上面的问题,因为我们要解决的是多用户去访问同一商品,去点击同一商品,重定向只能保证同一用户去点击或刷新。但是二级缓存可以解决这些问题。
我们先详细解说一下基于Hibernate4.3的二级缓存技术,然后再针对本项目做一个具体的配置。
1. Hibernate4.3二级缓存基本配置
与Hibernate3不同,Hibernate4.3的核心包里没有跟缓存相关的类,我们要用二级缓存的话,需要加上缓存的jar包,从官方下载的hibernate-release-4.3.11.Final中的lib/optional/ehcache中有二级缓存所需要的jar包,先要添加到工程中。如下:
然后我们在hibernate.cfg.xml中配置二级缓存相关的配置:
- <hibernate-configuration>
- <session-factory>
- <property name="dialect">
- org.hibernate.dialect.MySQLDialect
- </property>
- <property name="show_sql">true</property>
- <!-- 配置二级缓存提供商,注意此处并不是缓存的jar包 -->
- <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
- <mapping class="cn.it.shop.model.Category" />
- <mapping class="cn.it.shop.model.Account" />
- <mapping class="cn.it.shop.model.Product" />
- <!-- 配置哪些类支持缓存,这里主要是显示首页的热门商品,所以Product类支持缓存 -->
- <class-cache usage="read-only" class="cn.it.shop.model.Product"/>
- </session-factory>
- </hibernate-configuration>
2. Hibernate4.3的查询策略
Hibernate支持两种查询方式:session查询和hql查询。
session中有session.save() update() delete() get() load()等方法,此方式仅仅操作一条记录,默认不用任何配置就支持二级缓存。因此:read-only配置对session是生效的。在session中如果二级缓存中配置了read-only,则session.update()和delete()操作都会失败,如果想要成功,则需要配置成read-write。但是save()和get() load()是成功的。
hql:此方式默认是用来操作多条记录,比如list()和executeUpdate() 方法。此方式默认二级缓存的配置包括read-only是无效的。hql的list()查询的是多条记录,直接查询数据库,并将查询的结果交给二级缓存,便于get()和load()的调用。executeUpdate也是不支持二级缓存的,也是直接到数据库更新,Hibernate会保证数据库与缓存同步。注意:hql是没有save()方法的,如果需要插入数据只能调用session.save()方法。
【注】:Hibernate中的一级缓存(默认存在)也称为session级别缓存,不是用来提升性能,而是用来处理事务的;二级缓存为sessionFactory缓存,对所有session都有效,生命周期与sessionFactory相同(sessionFactory是单例,而且项目启动时候就会创建)。
具体的查询策略,我们看下面的这张图:
【注】:图片文字如果太小,可以把图片拖到新的窗口看~
以上就是Hibernate的查询的策略,下面我们来继续看二级缓存的配置。
3. Hibernate4.3二级缓存高级配置
上面提到了,我们之所以在hibernate.cfg.xml中配置了两项就可以使用二级缓存,是因为有个默认的配置,下面我们先来看一下这个默认配置:- <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
- <!-- 如果缓存内存溢出,则存储到硬盘空间 -->
- <diskStore path="java.io.tmpdir"/>
- <defaultCache
- maxElementsInMemory="10000" : <!-- 内存支持的最大对象的数量 -->
- eternal="false" :<!-- 对象是否永久生效,建议为false,这样下面的两个参数才会有效 -->
- timeToIdleSeconds="60" :<!-- 对象的间隔周期,默认单位为秒。即60秒后如果还没人用这个对象,会提前销毁 -->
- timeToLiveSeconds="120" :<!-- 对象的生命周期,默认单位为秒 -->
- overflowToDisk="true" :<!-- 是否支持溢出到硬盘,建议为true -->
- maxElementsOnDisk="10000000" :<!-- 硬盘上支持的最大对象的数量 -->
- memoryStoreEvictionPolicy="LRU" :<!-- 对象的替换策略 -->
- />
- </ehcache>
以上是首页显示的部分内容,Hibernate已经从数据库中帮我们查出了显示信息,并且已经显示好了。我们将它们编个号,等会我们测试缓存的时候就方便分析了。下面我们开始测试一下上面的缓存配置项:
测试一:测试内存中的对象数量。将配置改成下面情况:
- <defaultCache
- maxElementsInMemory="6" <!-- 设置只支持缓存6个 -->
- eternal="true"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="FIFO" :<!-- 先进先出 -->
- />
测试二:测试对象的生命周期。将配置改成下面的情况:
- <defaultCache
- maxElementsInMemory="100"
- eternal="false" <!-- 配成false才能设置下面的生命周期 -->
- timeToIdleSeconds="20"
- timeToLiveSeconds="40"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="FIFO"
- />
测试三: 测试二级缓存是否支持硬盘存储。
- <defaultCache
- maxElementsInMemory="4"
- eternal="false" <!-- 配成false才能设置下面的生命周期 -->
- timeToIdleSeconds="100"
- timeToLiveSeconds="200"
- overflowToDisk="true" <!-- 配置成true才支持硬盘存储 -->
- memoryStoreEvictionPolicy="FIFO"
- />
测试四: 测试二级缓存的替换策略
- <defaultCache
- <!--
- FIFO已经淘汰了,不会再用了……
- LRU:最近最少被访问算法(时间策略),会忽略访问频率,离现在最远时间访问的会被替换掉
- LFU:最近最未使用算法(频率测量),会忽略访问的先后时间,访问频率最少的会被替换掉
- -->
- maxElementsInMemory="3"
- eternal="false" <!-- 配成false才能设置下面的生命周期 -->
- timeToIdleSeconds="100"
- timeToLiveSeconds="200"
- overflowToDisk="false" <!-- 配置成true才支持硬盘存储 -->
- memoryStoreEvictionPolicy="LFU"
- />
到这里,相信大家对二级缓存的使用已经掌握了,二级缓存的测试就到这里。下面针对我们这个网上商城的项目做一下配置。
4. 网上商城项目的实际配置
我们配置二级缓存的最大记录数为1000,设置生命周期为120秒,间隔周期为60秒,支持硬盘存储,并且使用频率优先(LFU)的替换策略,因为用户点击率高的,肯定要放在二级缓存里。
- <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
- <!-- 如果缓存内存溢出,则存储到硬盘空间 -->
- <diskStore path="java.io.tmpdir"/>
- <defaultCache
- maxElementsInMemory="1000"
- eternal="false"
- timeToIdleSeconds="60"
- timeToLiveSeconds="120"
- overflowToDisk="true"
- memoryStoreEvictionPolicy="LFU"
- />
- </ehcache>
相关阅读:http://blog.csdn.net/column/details/str2hiberspring.html
整个项目的源码下载地址:http://blog.csdn.net/eson_15/article/details/51479994
- 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示
- 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示
- 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示
- 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示
- 【SSH网上商城项目实战14】商城首页UI的设计
- 【SSH网上商城项目实战14】商城首页UI的设计
- 【SSH网上商城项目实战14】商城首页UI的设计
- 【SSH网上商城项目实战06】基于DataGrid的数据显示
- 【SSH网上商城项目实战06】基于DataGrid的数据显示
- 【SSH网上商城项目实战06】基于DataGrid的数据显示
- 【SSH网上商城项目实战22】获取银行图标以及支付页面的显示
- 【SSH网上商城项目实战22】获取银行图标以及支付页面的显示
- 【SSH网上商城项目实战22】获取银行图标以及支付页面的显示
- 【SSH网上商城项目实战04】EasyUI菜单的实现
- 【SSH网上商城项目实战07】Struts2和Json的整合
- 【SSH网上商城项目实战17】购物车基本功能的实现
- 【SSH网上商城项目实战20】在线支付平台的介绍
- 【SSH网上商城项目实战04】EasyUI菜单的实现
- php composer
- Redis各类型应用场景
- Maven(二)安装和运行Maven
- 【机器学习】多层感知机的理解
- 199. Binary Tree Right Side View(unsolved)
- 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示
- eclipse中获得html5标签提示
- java中“==”和euqals的区别
- 关于设备环境的获取方法
- java中的DAO设计模式
- 恢复被交换二叉搜索树的节点值
- Android View 事件分发机制 源码解析
- MySQL关闭查询缓存(QC)的两种方法
- linux下查看负载均衡的两种方法