类似上面这种分类栏目,需要经常展示但是有不经常修改的,我们应该做缓存处理。如果每展示一次就查询一次数据库,增加了与数据库的查询次数,感觉这是相当不推荐的。因为是刚接触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简介及配置。