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将缓存内容存入硬盘:
maxElementsOnDisk="10000"
overflowToDisk="true"
diskPersistent="true"
diskSpoolBufferSizeMB="20"
/>
当内存中的数据量超过了设置的最大记录数maxElementsInMemory,则会将多余的记录数存入硬盘,但是内存中已经存在的内容则不会自动存入硬盘,需要手动使用cache.flush()来强制将内存内容放入硬盘中;
一般maxElementsOnDisk的值需要设置的比maxElementsInMemory大,这样效率会高一些;
需要设置overflowToDisk为true,表示使用硬盘缓存策略;
需要设置diskPersistent为true,否则重启服务后缓存文件会被清理掉,同时该属性会在一定程度上拖慢缓存速度,因为它需要不停地监控设置的硬盘大小是否已满关联属性为diskSpoolBufferSizeMB,如果硬盘够大可以将该属性设置足够大;
最后 会生成*.index和*.data2个文件;
*重建缓存会自动从硬盘读取数据到内存
diskStore :指定数据存储位置,可指定磁盘中的文件夹位置
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();
}
}