用Java缓存机制创建更快的Web应用----基本用法
学习JCS的基本原理的一个好的方法是看它的API的最一般的用法。从缓存区自身的初始化开始是最好的地方。通过初始化JCS缓存区对象,你会获得访问缓存区所需要的几乎所有的共通方法。下面列出了初始化JCS对象并取得默认的缓存区实例的方法:
- // Initialize the JCS object and get an instance of the default cache region
- JCS cache = JCS.getInstance("default");
- // Set up
- String key = "key0";
- String value = "value0";
- // Place a new object in the cache
- cache.put(key, value);
在上面的例子中使用字符串作为参数的值,但是你可以使用任何对象。
- // Retrieve a cached object
- String cachedData = (String)cache.get(key);
- // Retrieve a cached object
- String cachedData = (String)cache.get(key);
- // Check if the retrieval worked
- if (cachedData != null) {
- // The cachedData is valid and can be used
- System.out.println("Valid cached Data: " + cachedData);
- }
- // Dispose of a specific cached item
- cache.remove(key);
- // Dispose of all cache data
- cache.clear();
- // Dispose of the cache region
- cache.dispose();
JCS和Java对象
JCS优于其他缓存系统的特点之一就是它能和类对象一起很好的工作。大多数用Java技术创建的Web应用程序都使用面向对象的方法。如果经常的从数据库中反复获取相同的对象,那么缓存这些对象有助于应用程序获得更好的性能,例如:
- package com.ibm.developerWorks.objects;
- import java.io.Serializable;
- import java.util.Date;
- public class BlogObject implements Serializable {
- private static final long serialVersionUID = 6392376146163510046L;
- private int blogId;
- private String author;
- private Date date;
- private String title;
- private String content;
- public BlogObject(int blogId, String author, Date date, String title, String content) {
- this.blogId = blogId;
- this.author = author;
- this.date = date;
- this.title = title;
- this.content = content;
- }
- public int getBlogId() {
- return this.blogId;
- }
- public String getAuthor() {
- return this.author;
- }
- public Date getDate() {
- return this.date;
- }
- public String getTitle() {
- return this.title;
- }
- public String getContent() {
- return this.content;
- }
- }
一旦有一个类对象实例,接下来就需要一个类来管理它,这个管理器来处理所有的管理事务和相对于blog对象的缓存功能。在这个例子中,管理器将处理三个主要的任务:
・获取blog对象
・把blog对象设定到缓存中
・从缓存中删除blog对象
在下面的代码中,getBolg()方法取得blog对象。这个方法首先试着从缓存中取得blog对象,如果在缓存中没有,它会用另外的机制来获得:
- public BlogObject getBlog(int id) {
- BlogObject blog = null;
- try {
- blogCache = JCS.getInstance(blogCacheRegion);
- blog = (BlogObject)blogCache.get(id);
- } catch (CacheException ce) {
- blog = null;
- }
- if (blog == null) {
- blog = DatabaseManager.getBlog(id);
- this.setBlog(
- blog.getBlogId(),
- blog.getAuthor(),
- blog.getDate(),
- blog.getTitle(),
- blog.getContent()
- );
- }
- return blog;
- }
下面的代码中的setBlog方法,会把blog对象放到缓存中。这个方法很简单,因为它只是用传递给他的信息创建一个新的blog对象,然后把它放到缓存中。
- public boolean setBlog(int bId, String author, Date date, String title, String content) {
- BlogObject blog = new BlogObject(bId, author, date, title, content);
- try {
- blogCache = JCS.getInstance(blogCacheRegion);
- blogCache.put(bId, blog);
- return true;
- } catch (CacheException ce) {
- return false;
- }
- }
下面代码中cleanBlog方法,既可以清除指定的一个blog对象也可以清除缓存中的所有blog对象。这个方法使用JCS的remove和clear方法来清除缓存对象。
- public boolean cleanBlog(int blogId) {
- try {
- blogCache = JCS.getInstance(blogCacheRegion);
- blogCache.remove(blogId);
- } catch (CacheException ce) {
- return false;
- }
- return true;
- }
- public boolean cleanBlog() {
- try {
- blogCache = JCS.getInstance(blogCacheRegion);
- blogCache.clear();
- } catch (CacheException ce) {
- return false;
- }
- return true;
- }
前面的类中演示了用JCS怎样简单的缓存对象以及管理对象,在Web应用程序中,这是一种强大的但却简单的处理对象的方法。
缓存元数据
JCS提供了比我们前面介绍的基本内容要丰富的多的功能。例如,它提供了搜集缓存对象和缓存区的元数据的功能,可以很容易的取得一下内容:
・缓存的键名;
・缓存项目被创建的时间;
・缓存的最大生存周期;
・被缓存项目的生存周期
下面的代码显示了怎样获取缓存项目的元数据。- try {
- JCSAdminBean admin = new JCSAdminBean();
- LinkedList linkedList = admin.buildElementInfo(regionName);
- ListIterator iterator = linkedList.listIterator();
- while (iterator.hasNext()) {
- CacheElementInfo info = (CacheElementInfo)iterator.next();
- System.out.println("Key: " + info.getKey());
- System.out.println("Creation Time: " + info.getCreateTime());
- System.out.println("Maximum Life (seconds): " + info.getMaxLifeSeconds());
- System.out.println("Expires in (seconds): " + info.getExpiresInSeconds());
- }
- } catch (Exception e) {
- }
对于被缓存项目的元数据是有用的,但是对于每个缓存区的元数据也是有益的。这些信息能够让你知道有多少缓存数据进入了缓存区,包括缓存失败还是成功,以及缓存的更新,下面的代码显示怎样搜集这些信息。
- try {
- JCSAdminBean admin = new JCSAdminBean();
- LinkedList linkedList = admin.buildCacheInfo();
- ListIterator iterator = linkedList.listIterator();
- while (iterator.hasNext()) {
- CacheRegionInfo info = (CacheRegionInfo)iterator.next();
- CompositeCache compCache = info.getCache();
- System.out.println("Cache Name: " + compCache.getCacheName());
- System.out.println("Cache Type: " + compCache.getCacheType());
- System.out.println("Cache Misses (not found): " + compCache.getMissCountNotFound());
- System.out.println("Cache Misses (expired): " + compCache.getMissCountExpired());
- System.out.println("Cache Hits (memory): " + compCache.getHitCountRam());
- System.out.println("Cache Updates: " + compCache.getUpdateCount());
- }
- } catch (Exception e) {
- }
搜集缓存区和缓存对象的元数据,来帮助分析Web站点的那个缓存区或缓存对象需要被优化。元数据还会帮助你管理时间敏感性的缓存数据,对于特定的需要更新数据的用户,可以使用最大的生命周期和每个缓存项目的终止时间来刷新缓存数据。
总结:
对于Java开发者,JCS是一个强大的,然而却简单易用的缓存系统。它为桌面和Web应用程序提供了同样的数据缓存。桌面应用程序的增长----像Web应用要求增强速度和灵活性一样,通过使用缓存数据也有助于达到同样的效果。这篇文章概要介绍了怎样配置和使用JCS,同时包括了基本缓存方法所需要的语法,在一个普通的Web应用程序中使用的缓存对象,以及获取缓存元数据的方法。