• 问题浅谈(一)


    问题浅谈:先去发现浅显的小问题,然后再去挖出底层的大问题,一步步剖析出问题的根本,再解决掉它!

      在最近的项目中,我遇到一个问题,拿出来跟大家分享一下,希望大家可以共同学习、共同进步!

      问题描述:我们项目中持久层用的是JPA加Hibernate的方式来进行实现,但是当中有个业务需要4张表联查,同时还有一些字段之间要计算一些聚合函数展现最终的结果。开始我们实现的方式用jpa进行查询,然后把拿到的结果集再java内存中进行计算,最终展现出来。但是!!!这样做出来之后,查询效率非常低。为什么呢?因为Hibernate的查询是以对象为单位进行查询,这样就导致了我们在查询时,各个表关系之间需要再查询每一条数据的同时还得要查询与之对应的外键的整个表。一旦数据量大了之后这样非常危险,会导致你的数据库瞬间爆照BOON......后来我们用了原生JDBCTemplate的方式,以写原生sql的方式来进行查询,并附以sql中的聚合函数的形式来操作。这样写出来之后,才查询效率方面有了很大的提速,原来需要10秒多才能查询出来的,现在只需要1秒左右就可以实现。

      解决办法:原生JDBCTemplate的方式实现

      拓展:jpa配合Hibernate的方式在实现3张及以下表关系的时候还是非常方便的,因为jpa为我们封装了大量的增删改查的方法供我们使用,Hibernate采用了面向对象的思想,以对象为单位,对整个对象有了很大的把控,但是正是因为它采用了面向对象的思想,我们在执行查询的时候每次都是以对象为整体进行操作,这样我们在查询像findBy..的时候它就会查询整个数据表。极大的拖慢了我们的查询速度!!!但是原生的sql在执行查询的时候,底层sql是每条执行的,有目的的去查,在执行像findBy。。。的时候效率还是很高的。但是jpa也允许我们写自定义的jsql语句,只需要我们使用@Quary注解即可。

      总结:综上,我们在多表间关系查询的时候,我们最好使用原生sql的方式查询,效率高,但是我们要写大量的sql语句,对于不会写sql语句的童鞋来说还是蛮痛苦的。而我们在23张表之间查询的时候,jpa还时有很大的便利的,省去了我们写大sql的功夫,运用封装好的方法,极大的简化了我们的代码量,使程序极为简介。同时jpa的动态查询也十分便利,将动态条件以数组的形式装起来,想用哪个用哪个,还不是爽歪歪!!!

      sql是基础,jpa的成品,用成品是趋势,但是底层的sql还是需要好好研究,毕竟万丈高楼平地起啊~

  • 相关阅读:
    0414结对 复利
    0619-学习进度条
    测试
    冲刺一总结
    实验四主存空间的分配和回收
    0622-软件工程学期总结
    学术诚信与职业道德有感
    《构建之法》第8、9、10章
    0512 操作系统进程调度实验
    构建之法 第6~7章读后感和对Scrum的理解
  • 原文地址:https://www.cnblogs.com/Edward-Wang/p/6674057.html
Copyright © 2020-2023  润新知