刚开始看mybatis ,在结合缓存的时候,遇到个问题,按照官方文档上面配置的ehcache配置,相应的jar包也加入进来,但是无路如何都没有成功
数据每次都是从数据库里面读取的,命中要么为0 ,要么直接miss
不知道啥原因,谁帮忙看下
代码如下 先看debug 信息
2012-07-17 12:47:47,124 [main] DEBUG [net.sf.ehcache.store.MemoryStore] - Initialized net.sf.ehcache.store.MemoryStore for com.ztiny.mybatis.dao.impl
2012-07-17 12:47:47,126 [main] DEBUG [net.sf.ehcache.Cache] - Initialised cache: com.ztiny.mybatis.dao.impl
2012-07-17 12:47:47,189 [main] DEBUG [net.sf.ehcache.Cache] - com.test.mybatis.dao.implCache: com.ztiny.mybatis.dao.implMemoryStore miss for 139696085:3585427282:com.ztiny.mybatis.dao.impl.selectAll:0:2147483647:select name as username ,age from employee
2012-07-17 12:47:47,189 [main] DEBUG [net.sf.ehcache.Cache] -
com.test.mybatis.dao.impl cache - Miss
2012-07-17 12:47:47,391 [main] DEBUG [com.test.mybatis.dao.impl.selectAll] - ooo Using Connection [com.mysql.jdbc.Connection@6abde0]
2012-07-17 12:47:47,392 [main] DEBUG [com.test.mybatis.dao.impl.selectAll] - ==> Preparing: select name as username ,age from employee
2012-07-17 12:47:47,419 [main] DEBUG [com.test.mybatis.dao.impl.selectAll] - ==> Parameters:
2012-07-17 12:47:47,666 [main] DEBUG [net.sf.ehcache.Cache] - com.test.mybatis.dao.implCache: com.test.mybatis.dao.implMemoryStore miss for 139696085:3585427282:com.ztiny.mybatis.dao.impl.selectAll:0:2147483647:select name as username ,age from employee
2012-07-17 12:47:47,666 [main] DEBUG [net.sf.ehcache.Cache] -
com.test.mybatis.dao.impl cache - Miss
2012-07-17 12:47:47,674 [main] DEBUG [com.test.mybatis.dao.impl.selectAll] -
ooo Using Connection [com.mysql.jdbc.Connection@9f45f4]
2012-07-17 12:47:47,674 [main] DEBUG [com.test.mybatis.dao.impl.selectAll] - ==> Preparing: select name as username ,age from employee
2012-07-17 12:47:47,674 [main] DEBUG [com.test.mybatis.dao.impl.selectAll] - ==> Parameters:
上面的蓝色字体为第一次运行,第二次则,应该从缓存里面读数据,为什么这里还是从数据库里面读呢?
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../bin/ehcache.xsd">
<defaultCache overflowToDisk="true" eternal="true"/>
<diskStore path="f:/test/cache" />
</ehcache>
employee.xml
<mapper namespace="com.test.mybatis.dao.impl">
<cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
<select id="selectAll" resultType="com.test.entity.Employee">
select name as username ,age from employee
</select>
测试代码
@Override
public List<Employee> selectList() {
return super.getSession(false).selectList("selectAll");
}
public static void main(String args[]) throws Exception{
EmployeeDaoImpl emplDao = new EmployeeDaoImpl();
emplDao.selectList();//第一次
emplDao.selectList();//第二次,应该从缓存里面读取
}
mybatis 源码:
BoundSql boundSql = ms.getBoundSql(parameterObject);
//根据规则创建缓存对应的键,因为查询相同,所以第二次这个还是这个键,没错
CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);
//在执行查询
return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
Cache cache = ms.getCache();
if (cache != null) {
flushCacheIfRequired(ms);
if (ms.isUseCache() && resultHandler == null) {
ensureNoOutParams(ms, key, parameterObject, boundSql);
if (!dirty) {
cache.getReadWriteLock().readLock().lock();
try {
@SuppressWarnings("unchecked")
List<E> cachedList = (List<E>) cache.getObject(key);
if (cachedList != null) return cachedList;
} finally {
cache.getReadWriteLock().readLock().unlock();
}
}
List<E> list = delegate.<E> query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
//因为第一次没有缓存,所以创建了缓存然后再把数据放入缓存里面,但是这里有个问题,这个缓存每次都是重新创建的,大家可以去debug 看看,不知是我配置错了,还是怎么的,反正进入到这个方法里面,每次都是空的,看下面代码
tcm.putObject(cache, key, list); // issue #578. Query must be not synchronized to prevent deadlocks
return list;
}
}
//这里老是空对象,每次都是从新new
TransactionalCache txCache = transactionalCaches.get(cache);
if (txCache == null) {
txCache = new TransactionalCache(cache);
transactionalCaches.put(cache, txCache);
}
不知道有没有人碰到过类似的问题,谢谢
源码贴的可能不怎么规范,大家注意下,我只是截取了部分代码
问题补充:从贴下代码,好乱
这是 employee.xml
<mapper namespace="com.ztiny.mybatis.dao.impl">
<cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
<select id="selectAll" resultType="com.ztiny.test.entity.Employee">
select name as username ,age from employee
</select>
===============================================================
测试java代码
@Override
public List<Employee> selectList() {
return super.getSession(false).selectList("selectAll");
}
public static void main(String args[]) throws Exception{
EmployeeDaoImpl emplDao = new EmployeeDaoImpl();
emplDao.selectList();
emplDao.selectList();
}
=======================================================
ehcache.xml
<diskStore path="D:/cache" />
<defaultCache overflowToDisk="true" eternal="true"/>
=========================================================
部分源码
public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
Cache cache = ms.getCache();
if (cache != null) {
flushCacheIfRequired(ms);
if (ms.isUseCache() && resultHandler == null) {
ensureNoOutParams(ms, key, parameterObject, boundSql);
if (!dirty) {
cache.getReadWriteLock().readLock().lock();
try {
@SuppressWarnings("unchecked")
List<E> cachedList = (List<E>) cache.getObject(key);
if (cachedList != null) return cachedList;
} finally {
cache.getReadWriteLock().readLock().unlock();
}
}
List<E> list = delegate.<E> query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
tcm.putObject(cache, key, list); // issue #578. Query must be not synchronized to prevent deadlocks
return list;
}
}
return delegate.<E>query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
}
public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
BoundSql boundSql = ms.getBoundSql(parameterObject);
CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);
return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
}
public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
Cache cache = ms.getCache();
if (cache != null) {
flushCacheIfRequired(ms);
if (ms.isUseCache() && resultHandler == null) {
ensureNoOutParams(ms, key, parameterObject, boundSql);
if (!dirty) {
cache.getReadWriteLock().readLock().lock();
try {
@SuppressWarnings("unchecked")
List<E> cachedList = (List<E>) cache.getObject(key);
if (cachedList != null) return cachedList;
} finally {
cache.getReadWriteLock().readLock().unlock();
}
}
List<E> list = delegate.<E> query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
tcm.putObject(cache, key, list); // issue #578. Query must be not synchronized to prevent deadlocks
return list;
}
}
return delegate.<E>query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
}
相关推荐
Mybatis-ehcache 1.2.1 是一个集成项目,它将 Ehcache 缓存系统与 Mybatis 框架结合在一起,提供了一种高效、便捷的数据缓存解决方案。在这一版本中,Ehcache 被用作 Mybatis 的二级缓存,以改善数据库查询性能并...
MyBatis-Ehcache是一个集成框架,用于将流行的缓存解决方案Ehcache与MyBatis持久层框架结合使用。这个`mybatis-ehcache-1.0.3.rar`压缩包包含了MyBatis-Ehcache的1.0.3版本,提供了一个便捷的方式来在MyBatis应用...
MyBatis-Ehcache整合包是MyBatis框架与Ehcache缓存系统结合的版本,主要用于提升数据访问效率,减少数据库的负载。Ehcache是一个广泛使用的开源Java分布式缓存,它支持内存和磁盘存储,具有高性能、易用性以及可扩展...
springMVC+MyBatis+Ehcache项目整合 里面有几个调用的例子 还解决一般行整合出现 MyBatis事物无法回滚问题 Ehcache 以注解的方式进行整合 项目架构一般 不喜欢别骂我 没打算收你们的积分 不要问我叫什么 大家都叫我...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程...综上所述,MyBatis结合Ehcache可以构建高效的缓存解决方案,减少对数据库的访问,提升系统的响应速度。通过合理配置和使用,能够有效改善应用的性能。
当这两个技术结合时,可以为MyBatis提供高效的缓存策略。 首先,我们需要理解MyBatis的缓存机制。MyBatis提供了一级缓存和二级缓存两种级别。一级缓存是SqlSession级别的,同一个SqlSession内的相同查询会复用之前...
总结,通过SpringBoot、MyBatis和Ehcache的结合,我们可以实现高效的本地缓存机制,提高数据读取速度。Ehcache提供的配置灵活性使得我们能够根据项目需求调整缓存策略,如缓存大小、过期时间等。虽然在分布式环境中...
MyBatis与Ehcache结合提供了多种一致性策略,例如: 1. **读写一致**:一旦数据被更新,所有后续的读取都会得到最新的数据。 2. **会话内一致**:在同一个用户会话中,用户看到的数据始终是最新的。 3. **单调读...
MyBatis作为一种流行的持久层框架,结合EHCache(一种广泛使用的高性能Java缓存)可以极大地提升数据访问效率。本文将详细介绍如何在MyBatis项目中集成EHCache,包括安装配置、基本用法以及一些高级特性。 #### 二...
《Spring MVC + MyBatis + Ehcache:构建高效Web应用》 在当今的软件开发领域,Spring MVC、MyBatis和Ehcache是三个极为重要的技术组件,它们各自扮演着关键角色,共同构建出高性能、易维护的Web应用程序。本文将...
本项目是一个基于Spring MVC、MyBatis、Ehcache、Apache Shiro以及Bootstrap技术的仓库管理系统源码。这个系统的设计和实现涵盖了多个重要的Java Web开发技术,为学习和理解这些技术在实际应用中的结合提供了很好的...
"MayDay博客系统"是一个基于一系列主流Java技术构建的Web应用程序,主要采用了Spring Boot、MyBatis、EhCache、Thymeleaf和Bootstrap等框架和技术。这些技术在IT行业中被广泛使用,对于理解现代Web开发流程和相关...
Ehcache是一个开源的、轻量级的缓存解决方案,而MyBatis是一个优秀的持久层框架,两者结合可以优化数据库查询,减少不必要的数据库访问。下面将详细介绍如何进行Ehcache与MyBatis的整合,以及整合过程中可能需要的...
本实例主要涉及的技术栈包括SpringMVC、MyBatis、EhCache、FreeMarker以及Sitemesh,这些技术都是Java Web开发中的重要组件,各自承担着不同的职责。下面将分别详细介绍这些技术以及它们在整合中的作用。 1. ...
【标题】"mayday博客系统"是一个采用一系列现代技术构建的Web应用,它基于Spring Boot框架,结合MyBatis持久层框架,利用Ehcache进行缓存管理,并使用Thymeleaf作为模板引擎,同时采用了Bootstrap前端框架来提升用户...
SpringMVC作为控制器负责调度请求,MyBatis处理数据库交互,Ehcache提供缓存功能以提高性能,JSP生成动态视图,而Sitemesh则用于统一和美化整个网站的页面布局。这种架构模式在实际项目中非常常见,能够提供高效、...
标题 "spring mybatis ehcache" 涉及到的是一个集成Spring、MyBatis和Ehcache的项目实例。这个项目结合了这三个重要的Java技术,为数据库操作提供了一个高效、可扩展的解决方案。 Spring是一个开源的Java应用框架,...
将 Mybatis 与 Ehcache 结合使用,可以创建一个高效的缓存机制,降低数据库负载,提升应用程序响应速度。 在 Mybatis 中,缓存分为一级缓存和二级缓存。一级缓存是默认开启的,它基于 SqlSession 的生命周期,同一...