ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 动态代理限制缓存容器的容量

动态代理限制缓存容器的容量

原创 Linux操作系统 作者:壹頁書 时间:2013-11-07 21:12:54 1 删除 编辑
在Java Web中经常使用缓存,但是如果缓存数据量非常大,则容易出现OOM的情况。
可以使用动态代理,限制缓存容器的容量。
如果达到容量上限,则可以移除过期的缓存数据。

  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. import java.util.HashMap;
  5. import java.util.Map;

  6. public class MapInvocationHandler implements InvocationHandler {

  7.     private Map<String, String> map = new HashMap<String, String>();

  8.     private int limit = 10;

  9.     public MapInvocationHandler(int limit) {
  10.         this.limit = limit;
  11.     }

  12.     public MapInvocationHandler() {
  13.     }

  14.     public Map<String, String> getInstance() {
  15.         return (Map<String, String>) Proxy.newProxyInstance(map.getClass()
  16.                 .getClassLoader(), map.getClass().getInterfaces(), this);
  17.     }

  18.     @Override
  19.     public Object invoke(Object proxy, Method method, Object[] args)
  20.             throws Throwable {
  21.         Object result;
  22.         if ("put".equals(method.getName())) {
  23.             if (map.size() == limit) {
  24.                 return "已达容器上线";
  25.             }
  26.             System.out.println("Key:" + args[0] + ",Value:" + args[1]);
  27.         }
  28.         result = method.invoke(map, args);
  29.         return result;
  30.     }

  31.     public static void main(String[] args) {
  32.         Map<String, String> map = new MapInvocationHandler(3).getInstance();
  33.         map.put("1", "1");
  34.         map.put("2", "2");
  35.         map.put("3", "3");
  36.         String s = map.put("4", "4");
  37.         System.out.println(s);
  38.     }

  39. }

其中invoke方法中的proxy参数是代理对象。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-776054/,如需转载,请注明出处,否则将追究法律责任。

下一篇: Oracle外部表
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    621
  • 访问量
    5986609