博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JPA 底层的智能化技术
阅读量:2496 次
发布时间:2019-05-11

本文共 726 字,大约阅读时间需要 2 分钟。

上线过程很顺利,在上线完成后,发现数据库又大量的,慢sql。
都是根据一个id去做两个表的  left join
于是翻天覆地的去找个sql 来自于那个业务模块。 结果翻了一个地朝天也没有找到。
奇怪了, 先上的监控,并发有每秒几十个这种sql,肯定是一个经常被访问的地方,没有道理。
最后经过监控java 线程的动作。找到了问题所在。
引出了一段曲折的故事:
假如 有两个表   product   与product-item 表。对应于head detail 的关系。
在接口实现过程中,一般会用 手工的sql  直接去查询 product-item 表,然后把生成的结果集,转化/封装为一个product 对象返回给调用者。
这个实现也是没有问题的。
关键是JPA 的底层实现太智能化了,有点过头了, 底层发现你封装的这个product 实例中,有一部分字段是空的,
于是JPA 的底层就在想了,你丫的,怎么能这么干呢,资料不全啊。影响严重啊, 于是底层的自动补全机制,开始运作了,把你封装出来的结果集遍历一遍,对立面的每个对象都去 product 表里把相应的缺失的字段查出来,然后合并到你的结果集中。
问题关键是你的本意是,这些缺失的字段在真正的业务逻辑中是用不到的,不然谁傻傻的做这破事?
如果恰巧,你自己封装的结果集中,没有key。 那么对不起了。 开始的那个问题就出来。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133735/viewspace-746702/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/133735/viewspace-746702/

你可能感兴趣的文章
java并行流
查看>>
CompletableFuture 组合式异步编程
查看>>
mysql查询某一个字段是否包含中文字符
查看>>
Java中equals和==的区别
查看>>
JVM内存管理及GC机制
查看>>
Java:按值传递还是按引用传递详细解说
查看>>
Java中Synchronized的用法
查看>>
阻塞队列
查看>>
linux的基础知识
查看>>
接口技术原理
查看>>
PCB设计技巧与注意事项
查看>>
linux进程之间通讯常用信号
查看>>
main函数带参数
查看>>
PCB布线技巧
查看>>
关于PCB设计中过孔能否打在焊盘上的两种观点
查看>>
PCB反推理念
查看>>
京东技术架构(一)构建亿级前端读服务
查看>>
php 解决json_encode中文UNICODE转码问题
查看>>
LNMP 安装 thinkcmf提示404not found
查看>>
PHP empty、isset、innull的区别
查看>>