`

Ibatis之缓存插件

阅读更多

 

缓存类型 Types in [MEMORY、LRU、FIFO、OSCACHE]

Ibatis中实现com.ibatis.sqlmap.engine.cache. CacheController  [inteface]

public void flush(CacheModel cacheModel);/*Flush*/

public Object getObject(CacheModel cacheModel, Object key);/*Get*/

public Object removeObject(CacheModel cacheModel, Object key);/*Remove*/

public void putObject(CacheModel cacheModel, Object key, Object object);/*Add */

public void configure(Properties props);/*Set*/

 

如果Ibatis自带的缓存策略不适合你的具体应用,可以实现CacheController  Interface来实现自己的方法

 

一:MEMORY  内存缓存,和Java内存管理机制类似分为[SOFT、WEAK、STRONG]

 <property name="reference-type"  value="SOFT|WEAK|STRONG"/>

SOFT:

只有当目前内存不足的情况下,JVM 在垃圾回收时才会收回其包含的引用(JVM 并不是只有当内存不足时才启动垃圾回收机制,何时进行垃圾回收取决于各版本JVM 的垃圾回收策略。如某这垃圾回收策略为:当系统目前较为空闲,且无效对象达到一定比 率时启动垃圾回收机制,此时的空余内存倒可能还比较充裕)

 

WEAK:

WeakReference 比SoftReference 在引用的维持性上来看更加微弱。无需等到内存不足的情况,只要JVM 启动了垃圾回收机制,那么WeakReference 所对应的对象就将被JVM 回收。相对SoftReference 而言,WeakReference 被JVM 回收的概率更大。

 

STRONG:

所引用的对象几乎无法被回收重用。它指向的对象实际上已经被JVM 销毁(finalize 方法已经被执行),只是暂时还没被垃圾回收器收回而已。PhantomReference 主要用于辅助对象的销毁过程,在实际应用层研发中,几乎不会涉及。

 

其控制器com.ibatis.sqlmap.engine.cache.memory.MemoryCacheController

private MemoryCacheLevel cacheLevel = MemoryCacheLevel.WEAK;

private Map cache = Collections.synchronizedMap(new HashMap());/*Map 存储结构*/

 

二:LRU 最近最少使用算法

<property name="size" value="Number"/>

其控制器com.ibatis.sqlmap.engine.cache.lru.LruCacheController

private Map cache<Collections.synchronizedMap(new HashMap())>;
private List keyList<Collections.synchronizedList(new LinkedList())>;

Put算法

  public void putObject(CacheModel cacheModel, Object key, Object value) {
    cache.put(key, value);
    keyList.add(key);
    if (keyList.size() > cacheSize) {
      try {
        Object oldestKey = keyList.remove(0);
        cache.remove(oldestKey);
      } catch (IndexOutOfBoundsException e) {
        //ignore
      }
    }
  }

Get算法

  public Object getObject(CacheModel cacheModel, Object key) {
    Object result = cache.get(key);
    keyList.remove(key);
    if (result != null) {
      keyList.add(key);
    }
    return result;
  }

 

使用[沉淀]技巧把最近最少使用的沉淀到最前面

 

 

FIFO:

<property name="size" value="Number"/>

其控制器com.ibatis.sqlmap.engine.cache.fifo.FifoCacheController

  public void putObject(CacheModel cacheModel, Object key, Object value) {
    cache.put(key, value);
    keyList.add(key);
    if (keyList.size() > cacheSize) {
      try {
        Object oldestKey = keyList.remove(0);
        cache.remove(oldestKey);
      } catch (IndexOutOfBoundsException e) {
        //ignore
      }
    }
  }

public Object getObject(CacheModel cacheModel, Object key) {
    return cache.get(key);
  }

 

 

OSCACHE:使用oscache自带的配置文件oscache.properties

# CACHE IN MEMORY
#
# If you want to disable memory caching, just uncomment this line.
#
 cache.memory=false  /*是否缓存到内存中,一般为true,这里为测试缓存到磁盘*/


# CACHE KEY
#
# This is the key that will be used to store the cache in the application
# and session scope.
#
# If you want to set the cache key to anything other than the default
# uncomment this line and change the cache.key
#
 cache.key=__oscache_cache


# USE HOST DOMAIN NAME IN KEY
#
# Servers for multiple host domains may wish to add host name info to
# the generation of the key.  If this is true, then uncomment the
# following line.
#
# cache.use.host.domain.in.key=true


# CACHE LISTENERS
#
# These hook OSCache events and perform various actions such as logging
# cache hits and misses, or broadcasting to other cache instances across a cluster.
# See the documentation for further information.
#
# cache.event.listeners=com.opensymphony.oscache.plugins.clustersupport.JMSBroadcastingListener,
#                       com.opensymphony.oscache.extra.CacheEntryEventListenerImpl,
#                       com.opensymphony.oscache.extra.CacheMapAccessEventListenerImpl,
#                       com.opensymphony.oscache.extra.ScopeEventListenerImpl


# CACHE PERSISTENCE CLASS
#
# Specify the class to use for persistence. If you use the supplied DiskPersistenceListener,
# don't forget to supply the cache.path property to specify the location of the cache
# directory.
#
# If a persistence class is not specified, OSCache will use memory caching only.
#
cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener

# CACHE OVERFLOW PERSISTENCE
# Use persistent cache in overflow or not. The default value is false, which means
# the persistent cache will be used at all times for every entry.  true is the recommended setting.
#
# cache.persistence.overflow.only=true

# CACHE DIRECTORY
#
# This is the directory on disk where caches will be stored by the DiskPersistenceListener.
# it will be created if it doesn't already exist. Remember that OSCache must have
# write permission to this directory.
#
# Note: for Windows machines, this needs \ to be escaped
# ie Windows:
cache.path=c:\\myapp\\cache
# or *ix:
# cache.path=/opt/myapp/cache
#
# cache.path=c:\\app\\cache


# CACHE ALGORITHM
#
# Default cache algorithm to use. Note that in order to use an algorithm
# the cache size must also be specified. If the cache size is not specified,
# the cache algorithm will be Unlimited cache.
#


cache.algorithm=com.opensymphony.oscache.base.algorithm.LRUCache/*缓存淘汰算法*/


# cache.algorithm=com.opensymphony.oscache.base.algorithm.FIFOCache
# cache.algorithm=com.opensymphony.oscache.base.algorithm.UnlimitedCache

# THREAD BLOCKING BEHAVIOR
#
# When a request is made for a stale cache entry, it is possible that another thread is already
# in the process of rebuilding that entry. This setting specifies how OSCache handles the
# subsequent 'non-building' threads. The default behaviour (cache.blocking=false) is to serve
# the old content to subsequent threads until the cache entry has been updated. This provides
# the best performance (at the cost of serving slightly stale data). When blocking is enabled,
# threads will instead block until the new cache entry is ready to be served. Once the new entry
# is put in the cache the blocked threads will be restarted and given the new entry.
# Note that even if blocking is disabled, when there is no stale data available to be served
# threads will block until the data is added to the cache by the thread that is responsible
# for building the data.
#
# cache.blocking=false

# CACHE SIZE
#
# Default cache size in number of items. If a size is specified but not
# an algorithm, the cache algorithm used will be LRUCache.
#
cache.capacity=1000 /*Size*/


# CACHE UNLIMITED DISK
# Use unlimited disk cache or not. The default value is false, which means
# the disk cache will be limited in size to the value specified by cache.capacity.
#
# cache.unlimited.disk=false


# JMS CLUSTER PROPERTIES
#
# Configuration properties for JMS clustering. See the clustering documentation
# for more information on these settings.
#
#cache.cluster.jms.topic.factory=java:comp/env/jms/TopicConnectionFactory
#cache.cluster.jms.topic.name=java:comp/env/jms/OSCacheTopic
#cache.cluster.jms.node.name=node1


# JAVAGROUPS CLUSTER PROPERTIES
#
# Configuration properites for the JavaGroups clustering. Only one of these
# should be specified. Default values (as shown below) will be used if niether
# property is set. See the clustering documentation and the JavaGroups project
# (www.javagroups.com) for more information on these settings.
#
#cache.cluster.properties=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_ttl=32;\
#mcast_send_buf_size=150000;mcast_recv_buf_size=80000):\
#PING(timeout=2000;num_initial_members=3):\
#MERGE2(min_interval=5000;max_interval=10000):\
#FD_SOCK:VERIFY_SUSPECT(timeout=1500):\
#pbcast.NAKACK(gc_lag=50;retransmit_timeout=300,600,1200,2400,4800;max_xmit_size=8192):\
#UNICAST(timeout=300,600,1200,2400):\
#pbcast.STABLE(desired_avg_gossip=20000):\
#FRAG(frag_size=8096;down_thread=false;up_thread=false):\
#pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=true)
#cache.cluster.multicast.ip=231.12.21.132

 

 

一般推荐使用OSCACHE这个[专业]缓存插件

 

分享到:
评论

相关推荐

    iBATIS缓存的使用方法

    ### iBATIS缓存的使用方法 在数据库访问框架iBATIS中,缓存机制是一项重要的功能,它能够显著提高应用程序的性能。本文将详细介绍iBATIS中的缓存使用方法,包括缓存模型的配置、不同类型的缓存控制器以及如何在SQL...

    ibatis插件

    Ibatis插件则是为了增强Ibatis功能而设计的一系列扩展工具,它们能够帮助开发者在使用Ibatis时提高开发效率,提供诸如日志、缓存、自动填充、性能分析等功能。在本话题中,我们将主要讨论Ibatis插件的安装和使用。 ...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    源码中`org.apache.ibatis.cache.Cache`接口定义了缓存的基本操作,而具体的缓存实现如`org.apache.ibatis.cache.impl.PerpetualCache`则实现了缓存的存储和读取。 通过阅读和理解iBatis的源码,我们可以更深入地...

    ibatis demo,ibatis例子,ibatis示例

    8. **插件支持**:Ibatis允许开发者编写自定义插件,通过拦截器模式对SqlSession或Executor的行为进行扩展,如性能监控、日志记录等。 在ibatis demo中,我们可能还会看到如何配置Spring与Ibatis的集成,以便利用...

    ibatis_with_memcached

    4. **创建缓存插件**:编写自定义的Ibatis拦截器,拦截SQL执行,实现数据的缓存和读取。 5. **在Mapper接口和XML配置中启用缓存**:在需要使用缓存的Mapper接口和对应的XML配置文件中,启用并配置对应的缓存ID。 6. ...

    ibatis 开发指南 2004

    10. **缓存机制**:解析iBatis的缓存功能,包括本地缓存和二级缓存,如何配置和使用,以及缓存的生命周期和更新策略。 11. **动态SQL**:详细阐述如何利用iBatis的动态SQL特性,通过`&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, ...

    ibatis官方中文文档

    iBatis提供了本地缓存和二级缓存机制,可以提高查询效率。开发者可以根据需求配置缓存策略,例如开启或关闭缓存,设置缓存有效期等。 9. **插件**: iBatis支持自定义插件,通过拦截器机制,可以在执行SQL前或后...

    ibatis api 帮助文档+IBATIS 开发文档

    5. **缓存**:IBATIS支持本地缓存和全局缓存,可以有效减少数据库访问,提高性能。 6. **事务管理**:讲解了如何使用IBATIS的事务管理功能,包括手动和自动提交、回滚以及事务隔离级别设置。 7. **插件**:IBATIS...

    ibatis包

    8. **插件支持**:Ibatis支持自定义插件,可以在运行时拦截SqlSession的方法调用,实现如日志记录、性能分析等功能。 Ibatis因其简单易用、灵活高效的特点,在Java企业级应用中广泛使用。通过合理利用Ibatis,...

    IBATIS_IN_ACTION

    - **性能优化与缓存**:了解如何利用iBATIS的缓存机制来提高应用性能,减少数据库访问次数。 - **数据访问对象(DAO)模式**:深入研究iBATIS如何支持DAO模式,简化数据访问逻辑,实现业务逻辑与数据访问的分离。 - ...

    ibatis3.0示例

    通过以上对iBatis 3.0核心知识点的解析,我们可以看到,无论是配置、映射、动态SQL,还是事务管理、缓存和插件,iBatis都提供了强大且灵活的解决方案。结合mybatis-jpetstore-6.0.1示例,读者不仅可以深入理解iBatis...

    ibatis开发指南 ibatis教程

    7. **插件支持**:iBATIS支持自定义插件,可以扩展其功能,比如性能监控、日志记录等。 8. **最佳实践**:了解如何有效地组织DAO层,避免硬编码SQL,提高代码可维护性。 通过深入学习这些资料,你将能熟练掌握...

    ibatis3.1官方中文帮助文档

    7. **插件**:iBatis支持自定义插件,可以扩展其功能。文档会介绍如何编写和注册插件,以及现有的插件如PageHelper分页插件的使用。 8. **问题排查**:提供常见问题的解决方案,帮助开发者在遇到困难时能迅速找到...

    ibatis课件

    8. **缓存机制**:了解iBatis的本地缓存和二级缓存,以及如何在实际项目中合理利用缓存提高性能。 9. **最佳实践**:学习如何编写高效的iBatis代码,避免潜在的问题,提升项目的可维护性和扩展性。 通过系统学习并...

    开发Ibatis需要的类库

    7. **插件扩展**:Ibatis支持自定义插件,可以拦截SqlSession、Executor、StatementHandler等对象的方法调用,进行扩展或拦截,如性能监控、日志打印等。 8. **MyBatis Generator配置**:理解和配置MyBatis ...

    ibatis2.0开发指南(官网)

    9. **插件机制**:iBatis支持插件扩展,开发者可以通过编写插件实现自定义的功能,如日志、性能分析等。 10. **最佳实践**:提供在实际项目中使用iBatis的最佳实践建议,帮助开发者避免常见问题,提升开发效率。 ...

    iBATIS插件及教程+DEMO.

    iBATIS,全称为“Java SQL Mapping Framework”,是由Apache软件基金会开发的一款优秀的开源持久层框架。...在实际项目中,iBATIS可以大大提高开发效率,降低维护成本,是Java Web开发中常用的持久层框架之一。

Global site tag (gtag.js) - Google Analytics