学习JCS的基本原理的一个好的方法是看它的API的最一般的用法。从缓存区自身的初始化开始是最好的地方。通过初始化JCS缓存区对象,你会获得访问缓存区所需要的几乎所有的共通方法。下面列出了初始化JCS对象并取得默认的缓存区实例的方法:
// Initialize the JCS object and get an instance of the default cache region JCS cache = JCS.getInstance("default");
取得JCS实例以后,就可以调用大多数需要的方法。put方法把一个新的对象放到缓存区中。键(第一个参数)和值(第二个参数)是调用这个方法所需要的全部内容。下面是一个基本的例子:
// Set up String key = "key0"; String value = "value0"; // Place a new object in the cache cache.put(key, value);
在上面的例子中使用字符串作为参数的值,但是你可以使用任何对象。
使用JCS提供的get方法取得缓存中的对象也同样简单。下面是一个简单的例子,例子中也使用了一个字符串参数,但是你也是其他任意对象:
// Retrieve a cached object String cachedData = (String)cache.get(key);
在处理一个正在缓存的系统时,另一个可能需要的方法是验证缓存数据的有效性。对于测试缓存项目是否存在,JCS中没有定义特定的方法,但是可以使用get方法的返回值来达到验证的目的。下面的例子演示获得这个必要的功能的方法:
// 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); }
最后需要的更多的共通的缓存功能是清楚JCS的缓存项目和工作完成后的缓存区。JCS提供了一个clear方法,调用这个方法可以从缓存区删除所有的缓存数据,同时还提供了一个remove方法,用于删除指定的缓存项目。dispose方法也是有效的,它用于释放被初始化的JCS缓存区。下面列出了这些方法的使用方法:
// 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应用程序都使用面向对象的方法。如果经常的从数据库中反复获取相同的对象,那么缓存这些对象有助于应用程序获得更好的性能,例如:
首先,在设计一个简单的面向对象的网站中,要围绕JCS以需要保存的对象作为开始。在这个例子中,开发了一个简单的博客站点,因此要保存blog对象自身,下面给出了将要使用的BlogObject类。
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应用程序中使用的缓存对象,以及获取缓存元数据的方法。