oscache、ehcache缓存内容存入硬盘的方法

1.oscache将缓存内容存入硬盘:

cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener

cache.persistence.overflow.only=false

cache.path=d\:\\temp\\cache

*cache.persistence.class
指定类是被持久化的类。class必须实现PersistenceListener接口。
作为硬盘持久,可以实现com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener接口,但是在window系统中会出现文件名异常的问题导致文件无法创建,因为文件名是使用|串联
解决的方法有2个:1〉自己实现PersistenceListener接口,自定义实现类;2〉修改DiskPersistenceListener类的class方法然后覆盖jar包中的类。
注意:DiskPersistenceListener 需要设定硬盘路径:cache.path

*cache.path
指定硬盘缓存的路径。目录如果不存在将被建立。同时注意oscache应该要有权限写文件系统。
cache.path=c:\\myapp\\cache
or *ix:
cache.path=/opt/myapp/cache

*cache.persistence.overflow.only (NEW! Since 2.1)
指定是否只有在内存不足的情况下才使用硬盘缓存。
默认值false(不使用硬盘缓存)。但推荐是true如果内存cache被允许的话。这个属性彻底的改变了cache的行为,使得persisted cache 和memory完全不同。


oscache.properties

cache.memory=false

cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
cache.persistence.overflow.only=false
cache.path=d\:\\temp\\cache
cache.key=__oscache_no1
cache.capacity=1000

package ibatisCache;

import java.io.Reader;
import java.util.List;

import org.apache.log4j.PropertyConfigurator;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class SqlClientMap {
	
	
	public static SqlMapClient init() throws Exception{
		Reader reader = Resources.getResourceAsReader("ibatisCache/SqlMap.xml");
		return SqlMapClientBuilder.buildSqlMapClient(reader);
	}
	
	
	public static void main(String[] args){
		try {
			PropertyConfigurator.configure("src/log4j/log4j.properties");
			SqlMapClient sqlMapClient = init();
			List list = sqlMapClient.queryForList("test.selectTest");
			for(int i = 0;i < list.size();i++){
				System.out.println(list.get(i));
			}
			
			
			list = sqlMapClient.queryForList("test.selectTest");
			for(int i = 0;i < list.size();i++){
				System.out.println("---" + list.get(i));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}



2.ehcache将缓存内容存入硬盘:

maxElementsInMemory="36"
maxElementsOnDisk="10000"
overflowToDisk="true"

diskPersistent="true"
diskSpoolBufferSizeMB="20"
/>

当内存中的数据量超过了设置的最大记录数maxElementsInMemory,则会将多余的记录数存入硬盘,但是内存中已经存在的内容则不会自动存入硬盘,需要手动使用cache.flush()来强制将内存内容放入硬盘中;

一般maxElementsOnDisk的值需要设置的比maxElementsInMemory大,这样效率会高一些;

需要设置overflowToDisk为true,表示使用硬盘缓存策略;

需要设置diskPersistent为true,否则重启服务后缓存文件会被清理掉,同时该属性会在一定程度上拖慢缓存速度,因为它需要不停地监控设置的硬盘大小是否已满关联属性为diskSpoolBufferSizeMB,如果硬盘够大可以将该属性设置足够大;

最后 会生成*.index和*.data2个文件;


*重建缓存会自动从硬盘读取数据到内存


diskStore :指定数据存储位置,可指定磁盘中的文件夹位置

maxElementsInMemory: 在内存中缓存的element的最大数目
maxElementsOnDisk: 在磁盘上缓存的element的最大数目,默认值为0,表示不限制。
eternal: 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
overflowToDisk: 如果内存中数据超过内存限制,是否要缓存到磁盘上。

以下属性是可选的:
timeToIdleSeconds: 对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。
timeToLiveSeconds: 对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。
diskPersistent: 是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。
diskExpiryThreadIntervalSeconds: 对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。
diskSpoolBufferSizeMB: DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。
memoryStoreEvictionPolicy: 如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。


ehcache.xml


    
	
	

            
    





package ehcache_test;

import ibatisCache.SqlClientMap;

import java.net.URL;
import java.util.List;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

import org.apache.log4j.PropertyConfigurator;

import com.ibatis.sqlmap.client.SqlMapClient;

public class EhcacheTest {
	
	public static void main(String[] args) throws Exception{
		PropertyConfigurator.configure("src/log4j/log4j.properties");
		/**
		 * 创建缓存管理对象
		 */
		URL url = EhcacheTest.class.getResource("ehcache.xml");
		CacheManager cacheManager = CacheManager.create(url);
		Thread.sleep(10000);
		
		/**
		 * 获取缓存对象
		 */
		Cache cache = cacheManager.getCache("authCache1");
		/**
		 * 存入数据
		 */
		SqlMapClient sqlMapClient = SqlClientMap.init();
		List list = sqlMapClient.queryForList("test.selectTest");
		for(int i = 0;i < list.size();i++){
			Element element = new Element(i, list.get(i));
			cache.put(element);
			System.out.println(list.get(i));
		}
		
		/*强行输出内存数据到硬盘*/
		cache.flush();
		Thread.sleep(5000);
		
		/**
		 * 关闭ehcache
		 */
		Thread.sleep(5000);
		cacheManager.shutdown();
		
		/**
		 * 取出数据
		 */
		cacheManager = CacheManager.create(url);
		Thread.sleep(10000);
		
		cache = cacheManager.getCache("authCache1");
		
		for(int i = 0;i < 36;i++){
			Element elements = cache.get(i);
			System.out.print(elements.getKey() + " ----- ");
			System.out.println(elements.getValue());
		}
		
		cacheManager.shutdown();
	}
	
}




以上是个人总结和借鉴的一些经验,有不足之处还请指出一起讨论






你可能感兴趣的:(oscache、ehcache缓存内容存入硬盘的方法)