wordpress建数据库,天津网站优化多少钱,网站关键词推广企业,wordpress 微信小程序特别说明#xff1a;由于二级缓存是基于Mapper的#xff0c;当你在不同的mapper中查询了相同的数据#xff0c;例如不同的Mapper中有多表查询时结果中有相同的数据#xff0c;当其中一个Mapper进行插入更新缓存时#xff0c;另一个并没有插入更新#xff0c;那么使用两个…特别说明由于二级缓存是基于Mapper的当你在不同的mapper中查询了相同的数据例如不同的Mapper中有多表查询时结果中有相同的数据当其中一个Mapper进行插入更新缓存时另一个并没有插入更新那么使用两个mapper查询出来的数据会出现数据不一致的情况所以MyBatis默认的二级缓存的实现方式需要慎用也因此MyBatis的二级缓存都默认关闭。主要步骤(基于springbootmybatis)1 导入依赖org.mybatis.spring.bootmybatis-spring-boot-starter1.3.2mysqlmysql-connector-java5.1.8org.mybatis.cachesmybatis-ehcache1.1.02 开启全局缓存开启全局配置3 配置ehcache.xml注意ehcache.xml必须放在classpath路径下并且名字必须是ehcache.xml(因为CacheManager默认就是加载classpath路径下的ehcache.xml文件当然也可以自己设置这就需要自己继承EhcacheCache自己写逻辑)maxElementsInMemory10000maxElementsOnDisk0eternaltrueoverflowToDisktruediskPersistenttruetimeToIdleSeconds0timeToLiveSeconds0diskSpoolBufferSizeMB50diskExpiryThreadIntervalSeconds120memoryStoreEvictionPolicyLFU/nameuser_cachemaxElementsInMemory5000overflowToDiskfalsediskPersistenttruetimeToIdleSeconds1800timeToLiveSeconds1800memoryStoreEvictionPolicyLRU/这里最重要的就是默认缓存配置因为CacheManager.addCache(name)添加的缓存就是通过默认配置创建的具体每个属性代表的意思可以查询Ehcache的属性配置网上很多这里不细述。4 在mapper中开启缓存并指定使用Ehcache在一个mapper中通过以下代码添加缓存。假设通过引入缓存的mapper的namespache为“com.dahuici.zyb.Dao.UserDao”其他mapper可以通过如下标签与其共享缓存。通过与配合使用可以让所有的mapper都共用一个缓存。特别提示如果使用的是mybatis-plus使用上面的步骤配置的话会发现调用mybatis-plus已经封装好的api缓存无效只有自己在mapper中定义的sql方法才有效。个人理解就是这些api是mybatis-plus自己封装好的封装的时候没有开启缓存解决办法是如下在dao层使用注解引用其他mapper的缓存共享缓存mybatis-plus共享缓存EhcacheCache源代码研究public class EhcacheCache extends AbstractEhcacheCache {public EhcacheCache(String id) {super(id);if (!CACHE_MANAGER.cacheExists(id)) {//根据默认配置创建缓存CACHE_MANAGER.addCache(id);}this.cache CACHE_MANAGER.getEhcache(id);}}对于mybatis也可以自定义缓存只需实现org.apache.ibatis.cache接口需要注意的是必须要有一个传入String类型的一个构造方法mybatis会自动调用并将namespace的值作为id传入。package org.apache.ibatis.cache;import java.util.concurrent.locks.ReadWriteLock;public interface Cache {//获取缓存idString getId();//往缓存中放入对象void putObject(Object key, Object value);//获取对象Object getObject(Object key);//移除对象Object removeObject(Object key);//清除缓存数据void clear();//获取缓存尺寸int getSize();//获取读写锁ReadWriteLock getReadWriteLock();}