由于ehcache,许多并发读取+一次写入导致ObjectNotFoundException

 王漻_957 发布于 2023-01-31 19:09

我在高流量网站上使用Hibernate 3.6.8,ehcache 2.4.5(也尝试过最新的2.8.0),jvm 1.6.0_22,有时我会体验

ObjectNotFoundException:不存在具有给定标识符的行:[com.example.Foo#123]`

Foo通过最简单的代码创建一个新的(在这种情况下为id 123):

Foo foo = new Foo();
session.save(foo);

原因是在这个高流量网站的所有页面中,我得到Foo的是这样的:

session.createQuery("from Foo").setCacheable(true).list();

存储Foos 的表包含1000行,实体缓存在ehcache中:


我的Hibernate配置的其他可能相关的部分是:

jdbc:mysql://localhost:3306/example?characterEncoding=UTF-8
com.mysql.jdbc.Driver

org.hibernate.connection.C3P0ConnectionProvider
1
60
10
20
0
0
1
1

true
true

org.hibernate.transaction.JDBCTransactionFactory
thread
true

net.sf.ehcache.hibernate.SingletonEhCacheProvider
/ehcache.xml
true

错误发生一次然后消失.我怀疑ehcache查询缓存是使用新的实体id(123)id更新的,但实体缓存尚未使用该实体的内容进行更新.我使用JMeter在本地轻松地重现了这一点.

关于如何解决这个问题的任何想法?

Foo创作时,ObjectNotFoundException抛出一次.另一方面,如果我删除了一个实例,Foo那么我经常(并且永远)得到ObjectNotFoundException每次执行.list().堆栈跟踪可以在http://pastebin.com/raw.php?i=dp3HBgDB上看到

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有