类似上面这种分类栏目,需要经常展示但是有不经常修改的,我们应该做缓存处理。如果每展示一次就查询一次数据库,增加了与数据库的查询次数,感觉这是相当不推荐的。因为是刚接触javaweb,没有学习框架之前,我使用了EHcachel。
首先,我们需要在src下配置xml文件,名字就叫做ehcache.xml。ehcache.xml中的一些配置文件如下
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<!-- 指定一个文件目录,当EHCache(数据溢出)时候把数据写到硬盘上时,将把数据写到这个文件目录下 -->
<diskStore path="C:/ehcache"/>
<cache
name="BlogCache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
其中,着重注意缓存溢出存放的位置,即
diskStore path
并且name是唯一的,读取文件是需要使用到,
maxElementsInMemory是最大缓存元素数量,当超过这个数量时就会缓存在硬盘上。
当然你必须确保
diskPersistent是开启状态的。
好了,这些就是值得注意的配置文件。接下来我们开始导包,并且创建代码。
//创建缓存管理器
CacheManager cacheManager = CacheManager.create(CatrgoryServiceImpl.class.getClassLoader().getResourceAsStream("ehcache.xml"));
//获得对应的缓存区
Cache cache = cacheManager.getCache("BlogCache");
Element element = cache.get("list");
if(element==null){
//如果为空,查询数据库
System.out.println("查询了数据库");
CatrgoryDao catrgoryDao = (CatrgoryDao) BeanFactory.getBean("CatrgoryDao");
List<Catrgory>list= catrgoryDao.findAll();
element= new Element("list", list);
cache.put(element);
return list;
}
else{
//如果不为空
System.out.println("没有查询数据库");
List<Catrgory>list=(List<Catrgory>) element.getObjectValue();
return list;
}
在其中需要注意的是,EHcache的name不要写错,否则会报空指针异常。首先,创建管理器,然后根据对应的name获取相应的缓存区域,值得一提的是,其中利用到了类加载器读取src下面的xml文件.然后检查缓存区内是否含有对应字段的缓存,用的是cache的get方法,返回element对象.如果没有的话,查询数据库,并重新实例化element并调用put方法存入返回的值。如果缓存不为空的话,我们直接利用element的getObjectValue()方法直接查询我们想要的值。为了验证结果,我们可以在对应的判断中加入打印输出语句,验证我们的操作。
这就是在做项目中使用了EHcache并且使用心得。事实上,我们在使用缓存有利有弊,好处是与数据库的交互变少了,坏处就是如果以后要进行增删改查的操作时,我们要进行缓存同步处理,即调用remove方法。当然总体上看的话,还是好处比较多的。
好了如果想要了解关于缓存关于EHcache,建议你阅读ehcache简介及配置。