JBoss Cache:企业级Java事务缓存集群系统
jopen
10年前
JBoss Cache是一款基于Java的事务处理缓存系统,它的目标是构建一个以Java框架为基础的集群解决方案,可以是服务器应用,也可以是Java SE应用。
集群高可用性
JBoss Cache将会自动复制缓存数据,并且在集群中的服务器之间进行缓存数据的同步,这样可以保证任何一台服务器重启了都不会影响缓存的可用性。
集群缓存可避免系统瓶颈
JBoss Cache顾名思义是利用缓存来提高系统扩展性的,当我们的WEB系统遇到大量的数据库读写时,系统的瓶颈将会出现在数据库端,JBoss Cache正好可以解决数据库的频繁读取问题,解决这个瓶颈。
另外,由于JBoss Cache的缓存是在集群中的每一个服务器间同步的,因此也不会因为一台缓存服务器遇到性能问题而影响整个系统。
JBoss Cache的standalone用法
首先是初始化TreeCache
TreeCache tree = new TreeCache();
然后是读进配置文件
PropertyConfigurator config = new PropertyConfigurator(); config.configure("配置文件.xml");
然后开始服务
Tree.startService();
因为Tree的结构是用NODE来Access的,TreeCache这里就很简单的用:
/level1/level2/node1 来表示两级Tree下面的Node1。
现在我们添加几个要Cache的对象。
Tree.put("/level1/level2/node1", "key1", "value1"); String[] array = { "1", "2", "3", "4" } Tree.put("/level3/array/", "myarray", array);
大家可以看到,TreeCache里面可以存储任何种类的对象,包括所有复杂对象。
读取对象就很方便了,
String s = (String)Tree.get("/level1/level2/node1/", "key1");
value1就读出来了。
同理:
String[] sarr = (String[]) Tree.get("/level3/array/","myarray");
System.out.println(sarr[1]) 会显示2
最后停止服务:
Tree.stopService();
JBoss Cache的FileCacheLoader示例
首先创建一个FileCache类封装JBoss Cache的相关操作,如下:
package com.javaeye.terrencexu.jbosscache; import java.io.File; import java.util.Map; import org.jboss.cache.Cache; import org.jboss.cache.DefaultCacheFactory; import org.jboss.cache.Fqn; import org.jboss.cache.Node; import org.jboss.cache.config.CacheLoaderConfig; import org.jboss.cache.config.Configuration; import org.jboss.cache.loader.FileCacheLoader; import org.jboss.cache.loader.FileCacheLoaderConfig; /** * <p> * This is demo to illustrate how to use the JBoss Cache to cache your * frequently accessed Java objects in order to dramatically improve * the performance of your applications. This makes it easy to remove * data access bottlenecks, such as connecting to a database. * </p> * <p> * As a rule of thumb, it is recommended that the FileCacheLoader not * be used in a highly concurrent, transactional or stressful environment, * ant its use is restricted to testing. * </p> * * @author TerrenceX * * @param <T> */ public class FileCache<T> { /** * The JBoss Cache, used to cache frequently accessed Java objects. */ private Cache<String, T> cache; /** * @constructor * @param fsCacheLoaderLocation The file system location to store the cache */ public FileCache(File fsCacheLoaderLocation) { cache = initCache(fsCacheLoaderLocation); } /** * Create a Cache and whose cache loader type is File Cache Loader * * @param fsCacheLoaderLocation The file position used to store the cache. * * @return Cache */ public Cache<String, T> initCache(File fsCacheLoaderLocation) { // initiate a FileCacheLoader instance FileCacheLoader fsCacheLoader = new FileCacheLoader(); // prepare the file cache loader configuration file for File Cache Loader FileCacheLoaderConfig fsCacheLoaderConfig = new FileCacheLoaderConfig(); fsCacheLoaderConfig.setLocation(fsCacheLoaderLocation.toString()); fsCacheLoaderConfig.setCacheLoader(fsCacheLoader); // set configuration to File Cache Loader fsCacheLoader.setConfig(fsCacheLoaderConfig); // prepare the configuration for Cache Configuration config = new Configuration(); config.setCacheLoaderConfig(new CacheLoaderConfig()); config.getCacheLoaderConfig().addIndividualCacheLoaderConfig(fsCacheLoaderConfig); // create a Cache through the default cache factory return new DefaultCacheFactory<String, T>().createCache(config); } /** * Add a new node into the tree-node hierarchy * * @param fqn Full Qualified Name for the new node * @return */ public Node<String, T> addNode(Fqn<String> fqn) { return cache.getRoot().addChild(fqn); } /** * Remove a specified node from the tree-node hierarchy * * @param fqn Full Qualified Name for the specified node */ public void removeNode(Fqn<String> fqn) { cache.removeNode(fqn); } /** * Add node information to the specified node. * * @param fqn Full Qualified Name for the specified node * @param key The key of the node information * @param value The value of the node information */ public void addNodeInfo(Fqn<String> fqn, String key, T value) { cache.put(fqn, key, value); } /** * Batch add node information to the specified node. * * @param fqn Full Qualified Name for the specified node * @param infos Node informations map */ public void addNodeInfos(Fqn<String> fqn, Map<String, T> infos) { cache.put(fqn, infos); } /** * Get node information from the specified node. * * @param fqn Full Qualified Name for the specified node * @param key The key of the node information * @return */ public T getNodeInfo(Fqn<String> fqn, String key) { return cache.get(fqn, key); } /** * Remove node information from the specified node. * * @param fqn Full Qualified Name for the specified node * @param key The key of the node information */ public void removeNodeInfo(Fqn<String> fqn, String key) { cache.remove(fqn, key); } }
下面是一个测试案例:
package com.javaeye.terrencexu.jbosscache; import java.io.File; import org.jboss.cache.Fqn; public class Main { public static void main(String[] args) { FileCache<String> fileCache = new FileCache<String>(new File("d:\\tmp")); Fqn<String> jimmyFqn = Fqn.fromString("/com/manager/jimmy"); Fqn<String> hansonFqn = Fqn.fromString("/com/developer/hanson"); fileCache.addNode(jimmyFqn); fileCache.addNode(hansonFqn); fileCache.addNodeInfo(jimmyFqn, "en-name", "Jimmy Zhang"); fileCache.addNodeInfo(jimmyFqn, "zh-name", "Zhang Ji"); fileCache.addNodeInfo(hansonFqn, "en-name", "Hanson Yang"); fileCache.addNodeInfo(hansonFqn, "zh-name", "Yang Kuo"); String enName = fileCache.getNodeInfo(hansonFqn, "en-name"); System.out.println(enName); } }
运行结果如下:
- JBossCache MBeans were successfully registered to the platform mbean server. - JBoss Cache version: JBossCache 'Malagueta' 3.2.5.GA Hanson Yang
生成的缓存文件目录结构如下:
D:/tmp/com.fdb/manage.fdb/jimmy.fdb/data.dat D:/tmp/com.fdb/developer.fdb/hanson.fdb/data.dat
总结
JBoss Cache还有更多的用法,如果你的系统遇到数据库瓶颈问题,可以考虑使用JBoss Cache来解决。
本文链接:http://原网站已经失效/article/jboss-cache-java.html
本文作者:码农网 – 小峰