mybatis(9)--整合ehcache

本文介绍如何将MyBatis与Ehcache分布式缓存框架整合,以提升系统的性能和并发能力。通过实现MyBatis的Cache接口并配置ehcache.xml文件,可以有效地利用Ehcache来缓存查询结果。

ehcache是什么?

1.what?
它是一个分布式缓存框架

(1)什么叫分布式缓存呢?

我们系统为了提高系统并发,性能等,一半对系统进行分布式部署(集群部署方式)

这里写图片描述

当用户在服务器1中登录,它的信息将会存储在1中的缓存中,但当下次去服务器2中访问时,2中的缓存中并没有,所以我们将缓存集中式管理起来。如果不使用分布式缓存,缓存的数据将在各个服务器的缓存中单独存储,不方便系统开发。
mybatis不支持分布式缓存。需要和其他分布式缓存整合

2.how?
mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发就可以
mybatis和ehcache整合,在mybatis的包里,有这样一个cache接口的实现类
这里写图片描述

mybatis自己有个实现了cache接口的类

public class PerpetualCache implements Cache {...}

要和ehcache整合的话,需要先加入jar包
这里写图片描述

我们发现包下有这样的类:
这里写图片描述

我们在cache的type中将其设置为ehcache的实现类。

<!-- 指定cache接口实现类的类型,mybatis默认使用PerpetualCache  -->
    <cache type="org.mybatis.caches.ehcache.EhcacheCache.class">

    </cache>

加入ehcache的配置文件ehcache.xml

这里写图片描述

配置好了之后我们再去看测试代码:

还是刚才的测试二级缓存的代码:

Cache Hit Ratio [com.ddd.mybatis.mapper.UserMapper]: 0.0
2017-07-19 11:59:44,377 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Opening JDBC Connection
2017-07-19 11:59:45,019 [main] [org.apache.ibatis.datasource.pooled.PooledDataSource]-[DEBUG] Created connection 763812049.
2017-07-19 11:59:45,019 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@2d86d8d1]
2017-07-19 11:59:45,021 [main] [com.ddd.mybatis.mapper.UserMapper.findUserById]-[DEBUG] ==>  Preparing: SELECT * FROM USER WHERE id=? 
2017-07-19 11:59:45,068 [main] [com.ddd.mybatis.mapper.UserMapper.findUserById]-[DEBUG] ==> Parameters: 1(Integer)
2017-07-19 11:59:45,339 [main] [com.ddd.mybatis.mapper.UserMapper.findUserById]-[DEBUG] <==      Total: 1
User [id=1, username=王思聪, sex=男, birthday=Tue Jul 18 00:00:00 CST 2017, address=北京市海淀区, ordersList=null]
2017-07-19 11:59:45,344 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@2d86d8d1]
2017-07-19 11:59:45,344 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@2d86d8d1]
2017-07-19 11:59:45,345 [main] [org.apache.ibatis.datasource.pooled.PooledDataSource]-[DEBUG] Returned connection 763812049 to pool.
2017-07-19 11:59:45,345 [main] [com.ddd.mybatis.mapper.UserMapper]-[DEBUG] Cache Hit Ratio [com.ddd.mybatis.mapper.UserMapper]: 0.5
2017-07-19 11:59:45,345 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Opening JDBC Connection
2017-07-19 11:59:45,345 [main] [org.apache.ibatis.datasource.pooled.PooledDataSource]-[DEBUG] Checked out connection 763812049 from pool.
2017-07-19 11:59:45,345 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@2d86d8d1]
2017-07-19 11:59:45,346 [main] [com.ddd.mybatis.mapper.UserMapper.updateUser]-[DEBUG] ==>  Preparing: UPDATE USER SET username=?,birthday=?,sex=?,address=? WHERE id=? 
2017-07-19 11:59:45,348 [main] [com.ddd.mybatis.mapper.UserMapper.updateUser]-[DEBUG] ==> Parameters: 王思聪(String), 2017-07-18 00:00:00.0(Timestamp), 男(String), 北京市海淀区(String), 1(Integer)
2017-07-19 11:59:45,425 [main] [com.ddd.mybatis.mapper.UserMapper.updateUser]-[DEBUG] <==    Updates: 1
2017-07-19 11:59:45,425 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@2d86d8d1]
User [id=1, username=王思聪, sex=男, birthday=Tue Jul 18 00:00:00 CST 2017, address=北京市海淀区, ordersList=null]
2017-07-19 11:59:45,521 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@2d86d8d1]
2017-07-19 11:59:45,522 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@2d86d8d1]
2017-07-19 11:59:45,522 [main] [org.apache.ibatis.datasource.pooled.PooledDataSource]-[DEBUG] Returned connection 763812049 to pool.
2017-07-19 11:59:45,523 [main] [com.ddd.mybatis.mapper.UserMapper]-[DEBUG] Cache Hit Ratio [com.ddd.mybatis.mapper.UserMapper]: 0.3333333333333333
2017-07-19 11:59:45,523 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Opening JDBC Connection
2017-07-19 11:59:45,523 [main] [org.apache.ibatis.datasource.pooled.PooledDataSource]-[DEBUG] Checked out connection 763812049 from pool.
2017-07-19 11:59:45,523 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@2d86d8d1]
2017-07-19 11:59:45,527 [main] [com.ddd.mybatis.mapper.UserMapper.findUserById]-[DEBUG] ==>  Preparing: SELECT * FROM USER WHERE id=? 
2017-07-19 11:59:45,527 [main] [com.ddd.mybatis.mapper.UserMapper.findUserById]-[DEBUG] ==> Parameters: 1(Integer)
2017-07-19 11:59:45,530 [main] [com.ddd.mybatis.mapper.UserMapper.findUserById]-[DEBUG] <==      Total: 1
User [id=1, username=王思聪, sex=男, birthday=Tue Jul 18 00:00:00 CST 2017, address=北京市海淀区, ordersList=null]

测试成功!ehcache整合结束。

<think>我们正在处理一个关于在Java项目中配置MyBatisEhcache依赖的问题。用户需要知道如何添加正确的依赖项来集成Ehcache作为MyBatis的二级缓存。 根据引用[1],我们有一个具体的依赖配置示例: ```xml <!--MyBatis EHCache整合--> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.1</version> </dependency> <!--slf4j日志门面具体实现--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> ``` 注意,这里有两个依赖: 1. `mybatis-ehcache`:这是MyBatisEhcache的集成包。 2. `logback-classic`:因为Ehcache使用SLF4J作为日志门面,所以需要添加一个具体的日志实现(这里用的是Logback)。 此外,根据引用[3]和[5],我们还需要在MyBatis的配置中启用缓存。例如,在MyBatis的映射器XML文件中,我们可以通过添加`<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>`来指定使用Ehcache作为该映射器的缓存实现。或者,如果使用注解,可以在接口上使用`@CacheNamespace(implementation = EhcacheCache.class)`。 另外,引用[4]提到了数据源配置,但这不是直接关于Ehcache的,不过它提醒我们在配置整个项目时,数据源也是必要的部分。 引用[2]展示了一个MyBatis工具类,用于获取SqlSession,这在使用MyBatis时是常见的,但并不是Ehcache集成所特有的。 因此,我们可以总结出在Java项目(如Maven项目)中集成MyBatisEhcache的步骤: 1. 在pom.xml中添加`mybatis-ehcache`依赖。 2. 添加一个SLF4J的日志实现依赖(如Logback),因为Ehcache需要记录日志。 3. 在MyBatis的配置文件(如mybatis-config.xml)或映射器XML文件中配置使用Ehcache作为缓存实现。 注意:Ehcache本身也需要一个配置文件(如ehcache.xml),用于配置缓存的具体参数(例如缓存大小、存活时间等)。这个配置文件通常放在类路径下(如src/main/resources)。 下面,我们将按照用户要求,用中文提供详细的回答,并生成相关问题。</think>### MyBatisEhcache 集成依赖配置 在 Java 项目中集成 MyBatisEhcache 作为二级缓存,需添加以下核心依赖: #### Maven 依赖配置 ```xml <!-- MyBatis-Ehcache 集成包 --> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.1</version> </dependency> <!-- SLF4J 日志实现 (必需) --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> ``` #### 关键说明: 1. **核心依赖** - `mybatis-ehcache` 提供 MyBatisEhcache 的适配器 - 日志实现是**必需项**,Ehcache 依赖 SLF4J 记录操作日志[^1] 2. **MyBatis 配置** 在映射文件(Mapper XML)中启用缓存: ```xml <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> ``` 如需禁用特定查询缓存: ```xml <select id="findByPage" useCache="false">...</select> ``` 3. **Ehcache 配置文件** 需在类路径下添加 `ehcache.xml` 配置缓存策略: ```xml <ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxEntriesLocalHeap="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"/> </ehcache> ``` 4. **Spring 整合**(可选) 若使用 Spring,需引入配置: ```xml <import resource="applicationContext-ehcache.xml"/> ``` #### 工作流程: ```mermaid graph LR A[MyBatis 查询请求] --> B{检查二级缓存} B -- 缓存命中 --> C[返回缓存结果] B -- 未命中 --> D[执行数据库查询] D --> E[存储结果到 Ehcache] E --> F[返回查询结果] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值