原始配置信息:
<cacheModel id="userCache" type="OSCACHE" readOnly="false">
<flushInterval hours="24" />
<flushOnExecute statement="User.insert" />
<flushOnExecute statement="User.update" />
<flushOnExecute statement="User.deleteByPrimaryKey" />
<flushOnExecute statement="Role.deleteRUserRoleByUserId" />
<flushOnExecute statement="Workgroup.deleteRUserWorkgroupByUserId" />
<property name="size" value="2000" />
</cacheModel>
<select id="select" parameterClass="int" resultMap="result" cacheModel="userCache">
select ID, LOGIN_ID, PASSWORD, NAME, EMAIL, COMPANY_ID, STATUS, PHONE, GMT_UPDATE_PWD, CONTACT_TYPE, MOBILE, IDX_NUM
from USERS
<dynamic prepend="where">
<isParameterPresent> ID=#value#
</isParameterPresent>
</dynamic>
</select>
cache使用出现问题: 在执行第一次查询的时候,cache miss,执行数据库查询,stored cache。(这是正确的执行)
在执行第2次查询时,继续提示cache miss.
设置log4j.logger.com.opensymphony.oscache=DEBUG,查看cache日志输出。结果同一条记录,stored cache与 miss cache使用的key居然不一致。跟踪底层的代码,发现在生成cache key的时候,使用了对象的hashcode,故做如下的修正:
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!(obj instanceof User)) {
return false;
}
User u = (User) obj;
if (u.getId() != null && getId() != null)
return u.getId().equals(getId());
return super.equals(obj);
}
public int hashCode() {
if (getId() != null) {
return getId().hashCode();
}
return super.hashCode();
}
问题依然没有得到解决,郁闷 ~.~!
纠结了好久,终于找到问题的原因,在保证如上重写 hashcode的基础上,修改配置文件
<cacheModel id="userCache" type="OSCACHE" readOnly="true">
cache终于能正常使用。
分享到:
相关推荐
要开始使用 Ibatis,首先需要从官方网站下载最新版本的 ibatis jar 包,以及 log4j 日志框架的 jar 包。然后,在Java项目中添加这些库,配置log4j.properties以开启SQL日志输出。接着,新建主配置文件sqlMapConfig....
使用iBATIS时,首先需要在项目中引入iBATIS库,然后创建数据库配置文件(如`sqlmap-config.xml`),在此文件中定义数据源和事务管理器。接着,编写SQL Map文件,其中包含具体的SQL查询和存储过程。在Java代码中,...
本文将详细介绍iBATIS中的缓存使用方法,包括缓存模型的配置、不同类型的缓存控制器以及如何在SQL映射文件中应用这些缓存设置。 #### 一、缓存的基本概念 缓存是存储数据的一种临时区域,目的是减少重复查询数据库...
iBatis 中使用安全的拼接语句、动态查询、大于、小于、等于 iBatis 是一个流行的持久层框架,提供了许多强大的功能来帮助开发者构建高效、安全的数据库交互应用程序。本文将详细介绍 iBatis 中使用安全的拼接语句、...
以下是对iBATIS简易使用的详细解释: 1. **环境准备**: - **jar文件**:iBATIS框架运行需要依赖一些库文件,包括`log4j`用于日志记录,`ibatis`核心库,以及`jdbc`驱动,这些都需要添加到项目的类路径中。 - **...
本篇将深入探讨iBatis缓存技术,旨在帮助你理解并掌握如何在实际项目中有效应用iBatis缓存。 首先,我们要了解iBatis的缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的,也称为本地缓存,它存储在...
iBatis 是一款著名的开源持久层框架,专为Java应用程序设计,它允许开发者将SQL语句直接嵌入到Java代码中,从而简化了数据访问层的开发。在.NET环境中,iBatis同样提供了相应的实现,即iBatis .NET版。这个版本与...
开发指南会深入讲解如何初始化iBatis环境,包括设置配置文件、创建SqlMap文件、设计Mapper接口以及如何在Java代码中使用这些组件。此外,还会介绍如何处理结果集、执行批量操作、使用缓存机制等高级特性。 **iBatis...
对于那些想要了解或深入掌握iBATIS,特别是想在实际项目中使用iBATIS存储过程的开发者来说,这是一份非常宝贵的学习资料。 **iBATIS简介** iBATIS(现更名为MyBatis)是一个优秀的Java持久层框架,它简化了数据库...
2. **动态SQL**: IBatis支持动态SQL,这意味着开发者可以在SQL语句中根据条件自由拼接,无需在代码中进行复杂的字符串拼接。 3. **结果映射**: IBatis可以自动将查询结果映射到Java对象,也可以自定义映射规则,...
osCache可以被集成到各种Java应用中,包括Web应用,如Struts2、Spring和iBatis。下面将详细解释这些框架与osCache的结合使用及其相关知识点: 1. **Struts2与osCache**: - 在Struts2中,osCache可以用于缓存...
《iBatis 3.1 官方中文帮助文档》是开发者们学习和掌握iBatis框架的重要参考资料,尤其对于那些使用中文作为主要工作语言的程序员来说,这是一份非常实用的指南。iBatis是一个优秀的持久层框架,它允许开发者将SQL...
总的来说,这些文档覆盖了iBATIS的关键概念和实践,包括SQL Maps的创建和使用、DAO层的构建以及如何在实际项目中应用iBATIS。通过深入学习和实践,开发者可以充分利用iBATIS的灵活性和效率,简化数据库访问,提高...
通过对iBATIS内置别名列表的学习,我们不仅能够更好地理解iBATIS的工作原理,还能在实际项目中更加高效地使用该框架。此外,掌握这些内置别名也有助于提高配置文件的可读性和可维护性,减少因错误配置导致的问题。...
在iBATIS 2.0中文API中,我们可以深入理解这个框架的核心功能和用法,包括一对多、多对一的关系映射、属性设置以及解决方案的详细解析。 首先,一对多和多对一的关系映射是ORM(对象关系映射)中的关键概念。在...
值得注意的是,iBatis并不是以查询参数的Class的hashcode或toString方法作为Key的一部分,而是使用在sqlmap中使用的变量集合。 **缓存功能** - iBatis 支持`queryForObject`和`queryForList`方法的结果缓存,但其他...
iBatis详细使用手册(.net版) iBatis是一个基于.NET框架的持久层框架,提供了一种灵活、可控的方式来实现类ORM(Object-Relational Mapping)的解决方案。下面是对iBatis的详细使用手册的知识点总结: 1. iBatis...
在.NET中使用iBATIS时,首先需要安装iBATIS.NET库。可以通过NuGet包管理器或者直接下载源码编译来获取。在VS2008项目中,添加对iBATIS.NET的引用,这样就可以开始配置和使用了。 接着,我们看压缩包内的"数据库.txt...
Ibatis,又称为SQL Map,是一个优秀的持久层框架,它允许开发者将SQL语句直接写在配置文件中,与Java代码进行分离,使得数据库操作更加灵活、可维护。Ibatis的主要目标是简化Java应用与数据库之间的交互,提供一种...