关于JCS的介绍,小红帽的文章已写得非常清楚了,附后。
先到http://jakarta.apache.org/jcs/Downloads.html
下载jcs-1.2.6.jar,找了半天也没有找到它的源码和API文档,不知为什么?
在这个站点有: Using JCS: Some basics for the web ,不错,就用它练习。
一、创建值对象
假设有一BOOK,它在数据库中的表为:
Table BOOK
BOOK_ID_PK
TITLE
AUTHOR
ISBN
PRICE
PUBLISH_DATE
创建值对象如下:
package com.genericbookstore.data; import java.io.Serializable; import java.util.Date; public class BookVObj implements Serializable { public int bookId = 0; public String title; public String author; public String ISBN; public String price; public Date publishDate; public BookVObj() { } }二、创建缓存管理器
package com.genericbookstore.data; import org.apache.jcs.JCS; // in case we want to set some special behavior import org.apache.jcs.engine.behavior.IElementAttributes; public class BookVObjManager { private static BookVObjManager instance; private static int checkedOut = 0; public static JCS bookCache; private BookVObjManager()//构造函数 { try { bookCache = JCS.getInstance("bookCache"); } catch (Exception e) { // Handle cache region initialization failure } // Do other initialization that may be necessary, such as getting // references to any data access classes we may need to populate // value objects later } /** * Singleton access point to the manager. */ public static BookVObjManager getInstance() { synchronized (BookVObjManager.class) { if (instance == null) { instance = new BookVObjManager(); } } synchronized (instance) { instance.checkedOut++; } return instance; } /** * Retrieves a BookVObj. Default to look in the cache. */ public BookVObj getBookVObj(int id) { return getBookVObj(id, true); } /** * Retrieves a BookVObj. Second argument decides whether to look * in the cache. Returns a new value object if one can't be * loaded from the database. Database cache synchronization is * handled by removing cache elements upon modification. */ public BookVObj getBookVObj(int id, boolean fromCache) { BookVObj vObj = null; // First, if requested, attempt to load from cache if (fromCache) { vObj = (BookVObj) bookCache.get("BookVObj" + id); } // Either fromCache was false or the object was not found, so // call loadBookVObj to create it if (vObj == null) { vObj = loadBookVObj(id); } return vObj; } /** * Creates a BookVObj based on the id of the BOOK table. Data * access could be direct JDBC, some or mapping tool, or an EJB. */ public BookVObj loadBookVObj(int id) { BookVObj vObj = new BookVObj(); vObj.bookId = id; try { boolean found = false; // load the data and set the rest of the fields // set found to true if it was found found = true; // cache the value object if found if (found) { // could use the defaults like this // bookCache.put( "BookVObj" + id, vObj ); // or specify special characteristics // put to cache bookCache.put("BookVObj" + id, vObj); } } catch (Exception e) { // Handle failure putting object to cache } return vObj; } /** * Stores BookVObj's in database. Clears old items and caches * new. */ public void storeBookVObj(BookVObj vObj) { try { // since any cached data is no longer valid, we should // remove the item from the cache if it an update. if (vObj.bookId != 0) { bookCache.remove("BookVObj" + vObj.bookId); } // put the new object in the cache bookCache.put("BookVObj" + vObj.bookId, vObj); } catch (Exception e) { // Handle failure removing object or putting object to cache. } } }三、配置文件cache.ccf,它定义你配置何种类型的缓存、缓存的大小、过期时间等。
jcs.default.cacheattributes.UseMemoryShrinker=true
jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.default.cacheattributes.ShrinkerIntervalSeconds=60
jcs.default.cacheattributes.MaxSpoolPerRun=500
jcs.default.elementattributes=org.apache.jcs.engine.ElementAttributes
jcs.default.elementattributes.IsEternal=false
<%
BookVObjManager cache = BookVObjManager.getInstance();
BookVObj bv1=cache.getBookVObj(8,true);
out.println(bv1.bookId);
%>
五、测试:http://127.0.0.1:8080/jcs/testjcs.jsp
所有源文件请下载。
附: JCS(Java Caching System)简介以及相关文档作者:小红帽
概述
JCS是Jakarta的项目Turbine的子项目。它是一个复合式的缓冲工具。可以将对象缓冲到内存、硬盘。具有缓冲对象时间过期设定。还可以通过JCS构建具有缓冲的分布式构架,以实现高性能的应用。
对于一些需要频繁访问而每访问一次都非常消耗资源的对象,可以临时存放在缓冲区中,这样可以提高服务的性能。而JCS正是一个很好的缓冲工具。缓冲工具对于读操作远远多于写操作的应用性能提高非常显著。
JCS的详细说明在 http://jakarta.apache.org/turbine/jcs/
JCS的特性
JCS除了简单的将对象缓冲在内存中以外,还具有几个特性,以适应企业级缓冲系统的需要。这些特性包括时间过期、索引式硬盘缓冲、并行式的分布缓冲等。
内存缓冲
JCS现在支持两种内存缓冲算法LRU和MRU。通常都是使用LRU算法。
org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache
使用内存缓冲区需要定义缓冲区大小,当超过缓冲区限制时,会将缓冲内容抛弃掉。如果有配硬盘缓冲,则将挤出来的缓冲内容写入硬盘缓冲区。
时间过期
JCS对于缓冲的对象,可以设定缓冲过期时间,一个对象在缓冲区中停留的时间超过这个时间,就会被认为是“不新鲜”而被放弃。
索引式硬盘缓冲
一方面,为了避免缓冲区过大,撑爆虚拟机的内存,另一方面又希望能够缓冲更多的对象,JCS可以将超出缓冲区大小的对象缓存到硬盘上。配置上也比较方便,只需要指定缓冲临时文件的存放目录位置。硬盘缓冲将缓冲对象的内容写到文件上,但是将访问索引保存在内存中,因此也能够达到尽可能高的访问效率。
并行式的分布缓冲(Lateral)
通常,将对象缓冲在内存中,一方面提高了应用的性能,而另一方面却使得应用不可以分布式发布。因为假设一个应用配置在两台服务器上并行运行,而两台服务器单独缓冲,则很容易导致两个缓冲区内容出现版本上的不一致而出错。一个机器上修改了数据,这个动作会影响到本地内存缓冲区和数据库服务器,但是却不会通知到另一台服务器,导致另一台上缓冲的数据实际上已经无效了。
并行式的分布缓冲就是解决这个问题。可以通过配置,将几台服务器配成一个缓冲组,组内每台服务器上有数据更新,会横向将更新的内容通过TCP/IP协议传输到其他服务器的缓冲层,这样就可以保证不会出现上述情况。这个的缺点是如果组内的并行的服务器数量增大后,组内的数据传输量将会迅速上升。这种方案适合并行服务器的数量比较少的情况。
Client/Server式的缓冲(Remote)
客户/服务端式的缓冲集群。这种方式支持一个主服务器和最高达到256个客户端。客户端的缓冲层会尝试连接主服务器,如果连接成功,就会在主服务器上注册。每个客户端有数据更新,就会通知到主服务器,主服务器会将更新通知到除消息
↑返回目录
前一篇: jsp入门实例:好易多电子书店
后一篇: 用jfreechat编写图形化统计数据程序