15. 缓存功能

同DebugInterceptor构造方式一样, SimpleCacheInterceptor能缓存指定的sql查询结果

  1. List<String> lcs = new ArrayList<String>();
  2. lcs.add("user");
  3. SimpleCacheInterceptor cache =new SimpleCacheInterceptor(lcs);
  4. Interceptor[] inters = new Interceptor[]{ new DebugInterceptor(),cache};
  5. SQLManager sql = new SQLManager(style,loader,cs,new UnderlinedNameConversion(), inters);
  6. for(int i=0;i<2;i++){
  7. sql.select("user.queryUser", User.class, null);
  8. }

如上例子,指定所有namespace为user查询都将被缓存,如果此namespace有更新操作,则缓存清除,输出如下

  1. ┏━━━━━ Debug [user.queryUser] ━━━
  2. SQL select * from User where 1 =1
  3. 参数: []
  4. 位置: org.beetl.sql.test.QuickTest.main(QuickTest.java:54)
  5. 时间: 52ms
  6. 结果: [9]
  7. ┗━━━━━ Debug [user.queryUser] ━━━
  8. ┏━━━━━ Debug [user.queryUser] ━━━
  9. SQL select * from User where 1 =1
  10. 参数: []
  11. 位置: org.beetl.sql.test.QuickTest.main(QuickTest.java:54)
  12. 时间: 0ms
  13. 结果: [9]
  14. ┗━━━━━ Debug [user.queryUser] ━━━

第二条查询的时间为0,这是因为直接使用了缓存缘故。

SimpleCacheInterceptor 构造的时候接受一个类列表,所有sqlid的namespace,比如“user.queryUser” 的namespace是“user”,如果beetlsql的查询sqlid此列表里,将参与缓存处理,否则,不参与缓存处理

默认的缓存实现是使用内存Map,也可以使用其他实现方式,比如redies,只需要实现如下接口

  1. public static interface CacheManager{
  2. public void initCache(String ns);
  3. public void putCache(String ns,Object key,Object value);
  4. public Object getCache(String ns,Object key);
  5. public void clearCache(String ns);
  6. public boolean containCache(String ns,Object key);
  7. }