hibernate 中 query.list()的优化
2018年3月15日 今天做项目遇到一个需求,问题是在调用query.list()的时候,因为数据也多大概700条左右,查询一次需要30s+,这简直是不能忍,于是开始考虑怎么优化。
1.因为是单表查询,不涉及表间的复杂关联,所以想到的是可能是没加索引吧,那我就加上索引,重新启动项目查询,没有改变。
2.有人说是session连接没有释放,也就是session.colse(),对我这不适用。也有人说这是数据库连接过多了吧,自己的连接池太小了,那我就从500变成5000,依旧没变化。
3.问题还没有解决,有人说query.list()转化成对应的对象的list的时候可能因为对象(model)的属性太多导致的,那好,我把所有的没用的属性都删掉,留下大概7-8个左右属性,继续执行,依然如故···
4. 有人又说了 ---对于大数据量,使用qry.scroll()可以得到较好的处理速度以及性能。而且直接对结果集向前向后滚动。-------我怎么觉得这样反而降低了效率。
5.数据分页,既然数据这么多那咱们分页查询吧,于是我每页50条,查出所有数据。性能有所提升大概20s+。
后来依然没有解决问题,心想算了吧,明天再解决,突然想着,这么多条数据为什么非要一次性都取到呢?需求不合理啊····所以分页应该是最好的解决办法,想要下次再取,而且一次取得那么多数据也不合理。
2018年3月16日
唉,终于找到慢的原因了query.list() 执行效率相当的慢,我用的框架是Spring MVC + hibernate ,可能内部hibernate框架在转换list时候浪费时间了,我自己改变变成返回结果集,然后自己在拼装成list<Object> 效率提升约70倍
下面直接写出我之前的代码
public List<CategoryBean> getInstrumentClassRootSeedData(int i, int sizePage){
String hql = "select bean from CategoryBean bean where bean.levelcol = 2 ";
Query query = getSession().createQuery(hql);
query.setFirstResult(i);
query.setMaxResults(sizePage);
return query.list();
}
改进后的代码
public List<CategoryBean> getInstrumentClassRootSeedData(){
ScrollableResults srs=null;
List<CategoryBean> list = new ArrayList<CategoryBean>();
String hql = "select b.recid,b.objectid,b.stdcode,b.stdname,b.resid,b.parents"
+ " from CategoryBean b where b.levelcol = 2 order by b.stdcode";
Query query = getSession().createQuery(hql);
srs = query.scroll();
while(srs.next()){
CategoryBean categoryBean=new CategoryBean();
categoryBean.setRecid(srs.getString(0));
categoryBean.setObjectid(srs.getString(1));
categoryBean.setStdcode(srs.getString(2));
categoryBean.setStdname(srs.getString(3));
categoryBean.setResid(srs.getString(4));
categoryBean.setParents(srs.getString(5));
list.add(categoryBean);
}
return list;
}
就这样,彻底提升了效率,不过还是有疑问,query.list()到底做了什么?才会这么慢···
hibernate 中 query.list()的优化的更多相关文章
- Hibernate中Query.list()方法报IllegalArgumentException异常
最近在使用Hibernate开发项目,在写好hql语句,并初始化Query对象,执行Query.list()方法时,应用报IllegalArgumentException异常.经网上查询,现已经基本决 ...
- hibernate中Query的list和iterator区别(续)
打开cache后query的list和iterator方法区别 将query 的cache打开的话,缓存的是query本身,以hql 生成的 sql ,再加上参数,分页等信息做为key值,而不是que ...
- hibernate中Query的list和iterator区别
1.Test_query_list类 public class Test_query_iterator_list { public static void main(String[] args) { ...
- Hibernate中的query.setFirstResult(),query.setMaxResults();
一.query.scroll()和query.setFirstResult(),query.setMaxResults();这两种方法都可以取到一定范围内的数据,用来数据分页显示.那么两者区别,以及两 ...
- 分享知识-快乐自己:Hibernate 中Criteria Query查询详解
1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Cr ...
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- hibernate 中文文档
转载:http://blog.csdn.net/kevon_sun/article/details/42850387 Hibernate Annotations 参考文档 3.2.0 CR1 目录 前 ...
- Hibernate中 一 二级缓存及查询缓存(2)
缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存Cache.缓存目的:让数据更接近于应用程序,协调速度不匹配,使访问速度更 ...
- Hibernate中的配置对象
数据库连接:由 Hibernate 支持的一个或多个配置文件处理.这些文件是 hibernate.properties 和 hibernate.cfg.xml. 类映射设置:这个组件创造了 Java ...
随机推荐
- 二十一 Struts的数据校验两种方式:手动编码和xml校验
数据的校验: 一.前台校验:JS校验 JS的校验不是必须的,JS可以被绕行,可以提升用户体验 二.后台校验:编码校验 必须的校验 三.校验的方式: 手动编码(不建议使用) 配置文件(支持) 手动编码的 ...
- cin和cout输⼊输出
写再最前面:摘录于柳神的笔记: 就如同 scanf 和 printf 在 stdio.h 头⽂件中⼀样, cin 和 cout 在头⽂件 iostream ⾥⾯,看名字就知 道, io 是输⼊输出 ...
- Android音频录制MediaRecorder之简易的录音软件实现代码(转)
原文:http://www.jb51.net/article/46182.htm Android音频录制MediaRecorder之简易的录音软件实现代码 这篇文章主要介绍了Android音频录制Me ...
- Integer a = 200,b=200比较详解
题记:前几天面试Java基础给来了个面试题Integer a=200,b=200;System.out.println(a==b);当时回答是false,后来面试官又来了一个Integer a=100 ...
- Vue和vue-template-compiler版本不一致
vue项目,package.json中Vue和vue-template-compiler版本不一致时,执行npm run dev有时会报错, 提示vue和vue-template-compiler版本 ...
- Python 基础之模块之os os.path 及os与shutil对比
一: os 对系统进行操作 #注:以下操作都在linux环境下操作,且很多运行之前需要做好相关条件import os#(1)system() 在python总执行系统命令#os.system(&quo ...
- 设计模式课程 设计模式精讲 15-2 桥接模式Coding
1 代码演练 1.1 代码演练1 1.2 代码演练2 1 代码演练 1.1 代码演练1 需求: 打印出从银行获取的账号类 优点: a 假如我只用用一个银行接口 去获取账号的内容,银行实现类要有定期 ...
- 2016 年 31 款轻量高效的开源 JavaScript 插件和库
目前有很多网站设计师和开发者喜欢使用由JavaScript开发的插件和库,但同时面临一个苦恼的问题:它们中的大多数实在是太累赘而且常常降低网站的性能.其实,其中也有不少轻量级的插件和库,它们不仅轻巧有 ...
- NIKKEI Programming Contest 2019-2 D 部分分题解
请注意本文章所描写的算法只可以获得前 14 个测试点(含三个样例)的部分分,但是没有出现 WA 的情况. 题面 给出 \(m\) 个线段,每次可以从线段上任意一点以代价 \(c_i\) 走到线段上另一 ...
- sqlplus 登陆使用
select * from dept; input order by dname; 追加文本命令 del n 删除语句 celar buffer ; 清除缓冲区的命令 conn sys as ...