Giter VIP home page Giter VIP logo

mybatis-enhanced-cache's Introduction

mybatis-enhanced-cache

简 介

MyBatis Enhanced Cache, Control your Caches precisely!
该插件主要是为了弥补MyBatis二级缓存控制上的不足,提高二级缓存Cache和数据库数据的同步性和一致性,处理各个Cache之间的关联关系。 该插件可以精确地管理MyBatis的二级缓存,实现对MyBatis二级缓存细粒度的控制。
当执行过对数据库表的更新操作(update、delete、insert)时,可以指定清除由特定的StatementId表示的查询语句产生的缓存。

应 用 场 景:

当前的MyBaits对于缓存的比较粗糙,一般为一个Mapper配置一个Cache缓存,或者多个Mapper共用一个缓存。 而对缓存的维护都是独立的,缓存之间不会相互影响,指定的Mapper中的语句只会影响到该Mapper对应的Cache缓存。 有时候希望当执行某些更新操作时,能够刷新或者清空特定的查询语句产生的缓存,以避免数据不一致的情况。 ###举例


现有AMapper.xml 中定义了对数据库表ATable的CRUD操作,BMapper定义了对数据库表BTable的CRUD操作;
假设MyBatis的二级缓存开启,并且AMapper中使用了二级缓存,AMapper对应的二级缓存为ACache
除此之外,AMapper中还定义了一个跟BTable有关的查询语句,类似如下所述:

<select id="selectATableWidtJoin" resultMap="BaseResultMap" useCache="true">
      select * from ATable left join BTable on ....
</select>
  1. 执行了selectATableWithJoin操作,该查询的缓存会被放置到对应的二级缓存ACache中, 当再次执行相同的查询,则直接从二级缓存ACache中;
  2. 如果某个时候,BMapper中执行了对BTable的update操作(update 、delete、insert),BTable 的数据已经更新,
  3. 再次执行selectATableWithJoin操作,该查询的结果直接从二级缓存ACache中取,这时候就造成了**数据不一致**的情况

针对上述的问题,需要解决
当BMapper执行对BTable的update操作时,指定刷新 ACache中的 selectATableWithJoin语句产生的缓存

该插件正是解决上述的这一问题!

使用方法:

使用此插件非常简单:

  1. 在mybatisConfig.xml 文件中定义plugin节点如下:
  <plugins>
       <plugin interceptor="org.luanlouis.mybatis.plugin.cache.EnhancedCachingExecutor">
          <property name="dependency" value="dependencys.xml"/>
          <property name="cacheEnabled" value="true"/>
       </plugin>
  </plugins>
  1. dependencys.xml配置文件,配置StatemntId依赖关系
<?xml version="1.0" encoding="UTF-8"?>
<dependencies>
   <statements>
       <statement id="com.louis.mybatis.dao.DepartmentsMapper.updateByPrimaryKey">
          <observer id="com.louis.mybatis.dao.EmployeesMapper.selectWithDepartments" />
       </statement>
   </statements>
</dependencies>
  • <statement>节点配置更新语句和查询语句的依赖关系,如果id表示的更新语句执行了,会清空由配置的id表示的查询语句生成的缓存。
  • <observer>节点表示当父节点 id表示的更新语句执行后,应该清除此语句所产生的缓存

mybatis-enhanced-cache's People

Contributors

luanlouis avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mybatis-enhanced-cache's Issues

假如我在mybatis 中自定义一个cache ,然后在getObject 中需要执行一个sqlmap。我按图(红圈处)实现,执行出现问题,如栈信息(死循环了)。我应如何解决,或者 有没有其它什么方式执行呢?

假如我在mybatis 中自定义一个cache ,然后在getObject 中需要执行一个sqlmap。我按图(红圈处)实现,执行出现问题,如栈信息(死循环了)。我应如何解决,或者 有没有其它什么方式执行呢?
由于图片无法在这里插入,所以我引用了 csdn.net的链接过来

http://bbs.csdn.net/topics/392214448

关于这插件缓存并发的问题。作者有没有解决方案

问题1:这里会出现死锁吧??
private synchronized void clearSessionData() {
queryCacheOnCommit.clear();
updateStatementOnCommit.clear();
}

private synchronized void refreshCache() {
    cachingManager.refreshCacheKey(queryCacheOnCommit);
    // clear the related caches
    cachingManager.clearRelatedCaches(updateStatementOnCommit);
    clearSessionData();
}

问题2:并发问题
protected Object processUpdate(Invocation invocation) throws Throwable {
Object result = invocation.proceed();
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
Map<String ,Object> map = new HashMap();
map.put("id",mappedStatement.getId());
map.put("parameterObject",invocation.getArgs()[1]);
updateStatementOnCommit.add(map);
return result;
}
private synchronized void clearSessionData() {
queryCacheOnCommit.clear();
updateStatementOnCommit.clear();
}
第一个事务执行对updateStatementOnCommit 执行添加时,然后第二个事务执行截图二的方式,那第一个事务的updateStatementOnCommit 添加的值也给清除了。那这样就存在了问题吧???

为什么不是sharedCacheKeysPool.remove(statementId); 却是 sharedCacheKeysPool.remove(observable);

public void clearRelatedCaches(final Set<String> set) {

// sharedCacheKeysPool.display();
for (String observable : set) {
Set relatedStatements = observers.get(observable);
for (String statementId : relatedStatements) {
Cache cache = holds.get(statementId);
Set cacheKeys = sharedCacheKeysPool.get(statementId);
for (Object cacheKey : cacheKeys) {
cache.removeObject(cacheKey);
}

            //????为什么不是这样删掉的,而是删掉 sharedCacheKeysPool.remove(observable);???
            //sharedCacheKeysPool.remove(statementId);

        }
        // clear shared cacheKey Pool width specific key
        sharedCacheKeysPool.remove(observable);
    }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.