5

记一次懒查询错误

 2 years ago
source link: https://segmentfault.com/a/1190000041403315
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

记一次懒查询错误

发布于 2 月 14 日

这次测试的时候遇到了一个懒查询异常,懒查询错误在上个月也遇到过,当时参考网上意见关闭实体间懒查询。一周汇报的时候,老师建议我使用@Transactional事务注解,当时也顺利解决了。这次又遇到一个比较复杂的通过@Transactional事务注解却解决不了。
image.png

image.png
主要涉及方法大概是这样的,有一个队列存储元素,方法一是一个后台接口,负责将前台传入元素入队,方法二执行定时任务,每隔一段时间查看队列是否为空,如果不为空,则执行相应方法。执行相应方法时报错,说这个队头元素的关联实体的关联实体的关联实体报懒查询错误。我尝试在方法二上加入@Transactional事务注解,但是并没有解决问题,还是报相同错误。我也尝试在方法一上加入事务注解,也没有解决问题。
于是我通过上次错误,在相应对应实体上关闭懒查询,问题解决。但是这是单纯的关闭懒查询会徒增数据库压力。想着通过更好的办法解决。
然后就遇到了奇怪的事情。
当我在方法一上打断点查看入队的元素是否有问题时,通过下方显示district.children有相应对象,传入的值没有问题
image.png
然后在方法二上打断点查看获取的元素是否又问题,通过下方显示还是没有问题(运行时是这里报错的)。
image.png
第二次没有查看断点一元素,直接跳过,查看断点二,发现报懒查询错误。
image.png

想到用到关联实体类的时候重新从数据库查询一下。

// 防止懒查询异常
WebUser webUser = this.webUserService.getById(historyExportExcel.getWebUser().getId());

List<District> manageBuildings = this.districtService.getManageBuildingsWithWebUser(webUser);

成功解决。
仔细一想,我并没有将元素存入数据库中,而是临时保存在队列中,本质上保存在服务器内存中,但是也会有数据库相关错误,难道在java在底层也对类存储实现序列化存储?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK