using springmodules-cache

阅读更多

        项目进入了后期阶段,发现了不少的性能问题,其中有部分领域对象在应用的某些阶段相对稳定,于是准备采用cache,减少对象构建次数,减少数据库访问次数,有针对性地改善性能问题。

       using springmodules-cache的主要原因是其屏蔽了各个不同cache产品的接口差异性,提供了一致的编程模型,已经实现adapter的包括: EHCache, JBoss Cache, Java Caching System (JCS) and OSCache。

        由于我们的项目已经使用了spring2.0,要引入oscache,需要做的工作如下:

  1.  需要的jar包括:jgroups-all.jar,oscache-2.3.2.jar,spring-modules-cache.jar,spring.jar,commons-logging.jar,jakarta-oro.jar.
  2. 增加了ArgumentsCacheKeyGenerator类,实现org.springmodules.cache.key.CacheKeyGenerator接口。不使用sm自带的hashcodecachekeygenerator原因是,想自己能够在其它模块手动生成cacheKey,以便主动refresh cache。
    java 代码
    1. import java.io.Serializable;   
    2.   
    3. import org.aopalliance.intercept.MethodInvocation;   
    4. import org.springmodules.cache.key.CacheKeyGenerator;   
    5.   
    6. public class ArgumentsCacheKeyGenerator implements CacheKeyGenerator {   
    7.   
    8.     private String prefix="";   
    9.        
    10.     public Serializable generateKey(MethodInvocation mi) {   
    11.         // TODO Auto-generated method stub   
    12.         StringBuffer sb = new StringBuffer();   
    13.         sb.append(this.getPrefix()).append('_');   
    14.         Object[] args = mi.getArguments();   
    15.         forint i=0; i
    16.             sb.append(args[i]);   
    17.         }   
    18.         return sb.toString();   
    19.     }   
    20.   
    21.     public String getPrefix() {   
    22.         return prefix;   
    23.     }   
    24.   
    25.     public void setPrefix(String prefix) {   
    26.         this.prefix = prefix;   
    27.     }   
    28.   
    29. }  
  3. 增加了oscache_config.properties,cache容量为100个对象,调度算法为LRU。
    java 代码
    1. # CACHE ALGORITHM   
    2. #   
    3. # Default cache algorithm to use. Note that in order to use an algorithm   
    4. # the cache size must also be specified. If the cache size is not specified,   
    5. # the cache algorithm will be Unlimited cache.   
    6. #   
    7. cache.algorithm=com.opensymphony.oscache.base.algorithm.LRUCache   
    8. # cache.algorithm=com.opensymphony.oscache.base.algorithm.FIFOCache   
    9. # cache.algorithm=com.opensymphony.oscache.base.algorithm.UnlimitedCache   
    10.   
    11. # CACHE SIZE   
    12. #   
    13. # Default cache size in number of items. If a size is specified but not   
    14. # an algorithm, the cache algorithm used will be LRUCache.   
    15. #   
    16. cache.capacity=100  
    17.   
    18.   
    19. # CACHE IN MEMORY   
    20. #   
    21. # If you want to disable memory caching, just uncomment this line.   
    22. #   
    23. # cache.memory=false  
    24.   
    25.   
    26. # CACHE KEY   
    27. #   
    28. # This is the key that will be used to store the cache in the application   
    29. # and session scope.   
    30. #   
    31. # If you want to set the cache key to anything other than the default  
    32. # uncomment this line and change the cache.key   
    33. #   
    34. # cache.key=__oscache_cache   
    35.   
    36.   
    37. # USE HOST DOMAIN NAME IN KEY   
    38. #   
    39. # Servers for multiple host domains may wish to add host name info to   
    40. # the generation of the key.  If this is true, then uncomment the   
    41. # following line.   
    42. #   
    43. # cache.use.host.domain.in.key=true  
    44.   
    45.   
    46. # CACHE LISTENERS   
    47. #   
    48. # These hook OSCache events and perform various actions such as logging   
    49. # cache hits and misses, or broadcasting to other cache instances across a cluster.   
    50. # See the documentation for further information.   
    51. #   
    52. # cache.event.listeners=com.opensymphony.oscache.plugins.clustersupport.JMSBroadcastingListener,  \   
    53. #                       com.opensymphony.oscache.extra.CacheEntryEventListenerImpl,               \   
    54. #                       com.opensymphony.oscache.extra.CacheMapAccessEventListenerImpl,           \   
    55. #                       com.opensymphony.oscache.extra.ScopeEventListenerImpl   
    56.   
    57.   
    58. # CACHE PERSISTENCE CLASS   
    59. #   
    60. # Specify the class to use for persistence. If you use the supplied DiskPersistenceListener,   
    61. # don't forget to supply the cache.path property to specify the location of the cache   
    62. # directory.   
    63. #    
    64. # If a persistence class is not specified, OSCache will use memory caching only.   
    65. #   
    66. # cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener   
    67.   
    68. # CACHE OVERFLOW PERSISTENCE   
    69. # Use persistent cache in overflow or not. The default value is false, which means   
    70. # the persistent cache will be used at all times for every entry.  true is the recommended setting.   
    71. #   
    72. # cache.persistence.overflow.only=true  
    73.   
    74. # CACHE DIRECTORY   
    75. #   
    76. # This is the directory on disk where caches will be stored by the DiskPersistenceListener.   
    77. # it will be created if it doesn't already exist. Remember that OSCache must have   
    78. # write permission to this directory.   
    79. #   
    80. # Note: for Windows machines, this needs \ to be escaped   
    81. # ie Windows:   
    82. # cache.path=c:\\myapp\\cache   
    83. # or *ix:   
    84. # cache.path=/opt/myapp/cache   
    85. #   
    86. # cache.path=c:\\app\\cache   
    87.   
    88.   
    89. # THREAD BLOCKING BEHAVIOR   
    90. #   
    91. # When a request is made for a stale cache entry, it is possible that another thread is already   
    92. # in the process of rebuilding that entry. This setting specifies how OSCache handles the   
    93. # subsequent 'non-building' threads. The default behaviour (cache.blocking=false) is to serve   
    94. # the old content to subsequent threads until the cache entry has been updated. This provides   
    95. # the best performance (at the cost of serving slightly stale data). When blocking is enabled,   
    96. # threads will instead block until the new cache entry is ready to be served. Once the new entry   
    97. # is put in the cache the blocked threads will be restarted and given the new entry.   
    98. # Note that even if blocking is disabled, when there is no stale data available to be served   
    99. # threads will block until the data is added to the cache by the thread that is responsible   
    100. for building the data.   
    101. #   
    102. # cache.blocking=false  
    103.   
    104.   
    105.   
    106. # CACHE UNLIMITED DISK   
    107. # Use unlimited disk cache or not. The default value is false, which means   
    108. # the disk cache will be limited in size to the value specified by cache.capacity.   
    109. #   
    110. # cache.unlimited.disk=false  
    111.   
    112.   
    113. # JMS CLUSTER PROPERTIES   
    114. #   
    115. # Configuration properties for JMS clustering. See the clustering documentation   
    116. for more information on these settings.   
    117. #   
    118. #cache.cluster.jms.topic.factory=java:comp/env/jms/TopicConnectionFactory   
    119. #cache.cluster.jms.topic.name=java:comp/env/jms/OSCacheTopic   
    120. #cache.cluster.jms.node.name=node1   
    121.   
    122.   
    123. # JAVAGROUPS CLUSTER PROPERTIES   
    124. #   
    125. # Configuration properites for the JavaGroups clustering. Only one of these   
    126. # should be specified. Default values (as shown below) will be used if niether   
    127. # property is set. See the clustering documentation and the JavaGroups project   
    128. # (www.javagroups.com) for more information on these settings.   
    129. #   
    130. #cache.cluster.properties=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_ttl=32;\   
    131. #mcast_send_buf_size=150000;mcast_recv_buf_size=80000):\   
    132. #PING(timeout=2000;num_initial_members=3):\   
    133. #MERGE2(min_interval=5000;max_interval=10000):\   
    134. #FD_SOCK:VERIFY_SUSPECT(timeout=1500):\   
    135. #pbcast.NAKACK(gc_lag=50;retransmit_timeout=300,600,1200,2400,4800;max_xmit_size=8192):\   
    136. #UNICAST(timeout=300,600,1200,2400):\   
    137. #pbcast.STABLE(desired_avg_gossip=20000):\   
    138. #FRAG(frag_size=8096;down_thread=false;up_thread=false):\   
    139. #pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=true)   
    140. #cache.cluster.multicast.ip=231.12.21.132  
  4. 增加了cacheContext.xml,spirng中cache的配置文件.
    xml 代码
    1.  
    2.  
    3.      class="org.springmodules.cache.provider.oscache.OsCacheManagerFactoryBean">
         
         
       
          <bean id="cacheProviderFacade"  
    4.         class="org.springmodules.cache.provider.oscache.OsCacheFacade">  
    5.         <property name="cacheManager" ref="cacheManager" />        
    6.    bean>  
    7.        
    8.     <bean id="chinatechKeyGenerator" class="cache.key.ArgumentsCacheKeyGenerator" >  
    9.         <property name="prefix">  
    10.             <value>CHINATECHvalue>  
    11.       property>  
    12.    bean>  
    13.   
  5. 修改applicationContext.xml
    xml 代码
    1. <bean id="tc2"  
    2.     class="org.springmodules.cache.interceptor.proxy.CacheProxyFactoryBean">  
    3.     <property name="cacheProviderFacade" ref="cacheProviderFacade" />  
    4.     <property name="cacheKeyGenerator" ref="chinatechKeyGenerator" />  
    5.     <property name="cachingModels">  
    6.         <props>  
    7.             <prop key="get*">refreshPeriod=600;groups=CHINATECHprop>  
    8.         props>  
    9.     property>  
    10.     <property name="flushingModels">  
    11.         <props>  
    12.             <prop key="update*">groups=CHINATECHprop>  
    13.         props>  
    14.     property>  
    15.        
    16.     <property name="target" ref="tc2Target" />  
    17. bean>  
  6. 修改web.xml,增加cacheContext.xml初始化spring配置。

 springmodules站点:springmodules.dev.java.net/

oscache站点:www.opensymphony.com/oscache

  • mytest.rar (7.8 KB)
  • 描述: 上面都是说实际的项目,附件是一个java application的例子,供学习。TestCache测试源程序。需要自己下载需要的jar包。
  • 下载次数: 308

你可能感兴趣的:(Cache,Bean,JMS,Spring,XML)