All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sicheng.common.persistence.cache.DelegateCache Maven / Gradle / Ivy

There is a newer version: 4.1.1
Show newest version
/**
 * 本作品使用 木兰公共许可证,第2版(Mulan PubL v2) 开源协议,请遵守相关条款,或者联系sicheng.net获取商用授权。
 * Copyright (c) 2016 SiCheng.Net
 * This software is licensed under Mulan PubL v2.
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
 * You may obtain a copy of Mulan PubL v2 at:
 *          http://license.coscl.org.cn/MulanPubL-2.0
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PubL v2 for more details.
 */
package com.sicheng.common.persistence.cache;

import com.sicheng.common.web.SpringContextHolder;
import org.apache.ibatis.cache.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.locks.ReadWriteLock;

/**
 * 

标题: DelegateCache 委托类

*

描述: 通过DelegateCache类,把缓存操作委托给具体的实现类。 * 目标:通过修改一处spring配置文件切换二级缓存的实现(ehcache\redis),且不用修改100处mybatis的mapper映射文件

*

公司: 思程科技 www.sicheng.net

* * @author zhaolei * @date 2017年7月5日 下午12:57:37 */ public class DelegateCache implements Cache { private static Logger logger = LoggerFactory.getLogger(DelegateCache.class); //委托目标 private SecondLevelCache target; //缓存分区的name private String id; //缓存有效时间,每一个缓存分区,使用这一个统一的有效时间。 //缓存分区内存放着k\v的缓存数据,不能为每一条数据单独设置缓存有效期 //也不能访问读取时,为缓存数据延长有效期(无法续命) private int expire; /** * @param id * @Title:构造方法 * @Description: */ public DelegateCache(final String id) { if (id == null) { throw new IllegalArgumentException("Cache instances require an ID"); } //logger.debug("MyBatis二级缓存 id :" + id); this.id = id; } /** * 延迟注入,解决依赖顺序问题 */ private SecondLevelCache getTarget() { if (target != null) { return target; } else { synchronized (this) { if (target != null) { return target; } //从spring容器中获取 二级缓存的实现类 //重点:是多实例对象,每一张数据表对应一个对象 target = SpringContextHolder.getBean(SecondLevelCache.class); if (target == null) { logger.warn("未配置Mybatis二级缓存的实现类,系统将不启动二级缓存"); } if (target != null) { //设置缓存分区的name //设置缓存分区的有效期 target.init(id, expire); } return target; } } } /** *

描述: getId()

* * @return * @see org.apache.ibatis.cache.Cache#getId() */ @Override public String getId() { return id; } /** *

放入对象

* * @param key * @param value * @see org.apache.ibatis.cache.Cache#putObject(java.lang.Object, java.lang.Object) */ @Override public void putObject(Object key, Object value) { if (getTarget() == null) { return; } getTarget().putObject(key, value); } /** *

获取对象

* * @param key * @return * @see org.apache.ibatis.cache.Cache#getObject(java.lang.Object) */ @Override public Object getObject(Object key) { if (getTarget() == null) { return null; } return getTarget().getObject(key); } /** *

删除对象. 从3.3.0,此方法只在回滚时调用

* * @param key * @return * @see org.apache.ibatis.cache.Cache#removeObject(java.lang.Object) */ @Override public Object removeObject(Object key) { if (getTarget() == null) { return null; } return getTarget().removeObject(key); } /** *

清除此缓存实例

* * @see org.apache.ibatis.cache.Cache#clear() */ @Override public void clear() { if (getTarget() == null) { return; } getTarget().clear(); } /** *

可选。这个方法不被core调用

* * @return * @see org.apache.ibatis.cache.Cache#getSize() */ @Override public int getSize() { if (getTarget() == null) { return 0; } return getTarget().getSize(); } /** *

* 在3.2.6以后,本方法不再被核心调用 * 缓存所需的任何锁,必须由缓存程序内部自行提供。

* * @return * @see org.apache.ibatis.cache.Cache#getReadWriteLock() */ @Override public ReadWriteLock getReadWriteLock() { if (getTarget() == null) { return null; } return getTarget().getReadWriteLock(); } /** * 设置缓存的有效期(单位:秒) * mybstai会使用 标签的来调用来方法 */ public void setExpire(int expire) { this.expire = expire;//要延迟才能正常工作,这是被迫的。 } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy