项目开发中的缓存问题(hibernate+spring)

为了简要总结,我就大概写下自己的关键词语吧,这个项目是数据库访问层用的是hibernate。

1.EhCache是什么
    EhCache是Hibernate的二级缓存技术之一,可以把查询出来的数据存储在内存或者磁盘,节省下次同样查询语句再次查询数据库,大幅减轻数据库压力;

2.EhCache的使用注意点
    当用Hibernate的方式修改表数据(save,update,delete等等),这时EhCache会自动把缓存中关于此表的所有缓存全部删除掉(这样能达到同步)。但对于数据经常修改的表来说,可能就失去缓存的意义了(不能减轻数据库压力);

3.EhCache使用的场合
    3.1 比较少更新表数据
        EhCache一般要使用在比较少执行write操作的表(包括update,insert,delete等)[Hibernate的二级缓存也都是这样];
    3.2 对并发要求不是很严格的情况
        两台机子中的缓存是不能实时同步的;

3.在项目中的实现

   一:导入ehcache-1.2.3.jar 到lib下。
   二:导入ehcache.xml到src下。
           这边贴下ehcache.xml的内容:
<span style="color:#000000;"><?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--timeToIdleSeconds 当缓存闲置n秒后销毁 -->
<!--timeToLiveSeconds 当缓存存活n秒后销毁 -->
<!--
	     缓存配置
       name:缓存名称。
       maxElementsInMemory:缓存最大个数。
       eternal:对象是否永久有效,一但设置了,timeout将不起作用。
       timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
       timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
       overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
       diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
       maxElementsOnDisk:硬盘最大缓存个数。
       diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
       diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
       memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
       clearOnFlush:内存数量最大时是否清除。
--> 
	<diskStore path="java.io.tmpdir" />
	<defaultCache 
		maxElementsInMemory="500" 
		eternal="false"
		timeToIdleSeconds="300" 
		timeToLiveSeconds="1200" 
		overflowToDisk="true" />
	
	<cache 
		name="com.Liu.Pojo.User" 
		maxElementsInMemory="150" 
		eternal="false"
		timeToLiveSeconds="36000" 
		timeToIdleSeconds="3600" 
		overflowToDisk="true" />
</ehcache></span>
   三:修改要配置缓存的那个持久化类的对象关系映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.Liu.Pojo">
	<class name="User">
		<cache usage="read-only" region="com.Liu.Pojo.User" />
		<id name="id" type="java.lang.Integer">
			<column name="id" />
			<generator class="identity" />
		</id>
		<property name="uname" length="20" not-null="true" />
	</class>
</hibernate-mapping>

   四:在spring的配置文件中,hibernate部分加入xml 代码

<!-- 启用二级缓存,默认是(false)关闭的 --> 
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<!-- 设置查询缓存 如果不设置'查询缓存',那么hibernate只会缓存使用load()方法获得的单个持久化对象,
	如果想缓存使用 findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,
	就需要设置 hibernate.cache.use_query_cache true 才行 -->
<prop key="hibernate.cache.use_query_cache">true</prop>
 <!-- 指定缓存产品提供商 -->  
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
   五:在DAO中,调用find方法查询之前,设置使用缓存

若是hibernateTemplate则为:

String hql = "from User u ";
List<User> userList = new ArrayList<User>();
hibernateTemplate.setCacheQueries(true);
userList = hibernateTemplate.find(hql);

若是sessionFactory则为:

List all = null;
String hql = "from User u";
Query q = this.getSession().createQuery(hql);
q.setCacheable(true);//</span>利用缓存
all = q.list();

   六:在页面点击查询数据库中的说有User表下所有的用户名,并注意看console发出的查询语句

         1.没有设置缓存时:我点击页面的查询按钮,观看页面结果和后台打印的信息,明显的可以看到发出了3次查询语句。

         

         2.设置缓存时:我点击页面的查询按钮,观看页面结果和后台打印的信息,明显的可以看到发出了1次查询语句。

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值