JBoss Cache:企业级Java事务缓存集群系统

来源:互联网 发布:很有节奏感的网络歌曲 编辑:程序博客网 时间:2024/05/22 05:31

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.datD:/tmp/com.fdb/developer.fdb/hanson.fdb/data.dat

总结

JBoss Cache还有更多的用法,如果你的系统遇到数据库瓶颈问题,可以考虑使用JBoss Cache来解决。

原文地址:http://www.codeceo.com/article/jboss-cache-java.html

0 0
原创粉丝点击