java - 为什么 iBATIS 会给出过时的结果,即使禁用了缓存?

标签 java mysql spring caching ibatis

我有一个 Web 应用程序,我一直在慢慢地将它从 iBATIS 2 迁移到使用 Spring Data 的 JPA。

在大多数情况下,一切进展顺利,我一次只是为一个域对象迁移 DAO。但是,最近引起我注意的一个问题是网站的某些部分显示了过时的结果列表。

例如,我有一个“工单”部分,其中显示了未结工单列表,并允许您在单独的页面上查看特定工单。当我创建新工单时,我可以在其特定页面上正确查看该工单。但是,打开的工单列表似乎要过一段时间才会显示这张新工单。

我试图排除的事情:

  • 即使在禁用了 MySQL 查询缓存的系统上,我也会看到这个问题
  • 即使我设置了 cacheModelsEnabled="false" 也看到了这个问题在 iBATIS 配置中。
  • 即使我完全删除了 <cacheModel>,我也看到了这个问题元素和 cacheModel="x"我的 sqlMap 文件中的属性。
  • 只要我重新启动应用程序,我就会看到最新的结果。
  • 当我在 MySQL 客户端中执行查询 iBATIS should be running here 时,我确实看到了 iBATIS 结果中缺少的新票证。
  • 当我使用 Spring MVC 和 Spring Data JPA 模拟一个简单的工单列表时,我确实看到了新工单。

我也尝试用 iBATIS 排除某种奇怪的事务状态,但似乎这里根本没有使用任何事务。

我错过了什么?还有什么我应该想办法解决的吗?或者,我是否应该优先将 iBATIS 层完全替换为 Spring Data JPA,这似乎不受此问题的影响?

更新

我现在已经通过 git bisect 完成了很多最近的更改。 ,我已将其缩小到引入 Spring 的 org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter 的更改。 .

因此,似乎某些交易的生存时间比它应该的要长。我将添加更多日志记录以查看是否可以确认这一点,然后寻找避免使用该过滤器的方法。

最佳答案

如果在同一个SqlSession中做select,insert,select, 那么 SqlSession 缓存导致了这个问题。你将需要 插入后手动清除缓存:sqlSession.clearCache()。

关于java - 为什么 iBATIS 会给出过时的结果,即使禁用了缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29373286/

相关文章:

java - Spark框架和相对路径

java - 如何在非 spring boot 应用程序中设置 prometheus 端点

java - Spring 数据 : findByEntityNot() in a many to many relationship

java - 一个站点的 Java servlet 能否代替浏览器登录到另一个站点?

java - 减少 Lucene 文档索引的内存使用量

java - 无法访问数组的最后一个元素

mysql - SQL查询比较两个表

处理标记系统和收藏夹的 Mysql 查询

php - MySQL 存储过程返回 0 行

spring - 如何在 MongoRepository 上创建计数查询