效率杠杠的!读取大量MySQL数据,就用Mybatis 流式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了效率杠杠的!读取大量MySQL数据,就用Mybatis 流式相关的知识,希望对你有一定的参考价值。
参考技术A 最近公司提了个需求,说公司的旧系统的报表导出的时候,数据量超过一万就导不出来了。经过分析,是旧系统做了限制。在更新的时候,查看了导出时虚拟机GC情况,发现原先程序执行时,内存激增,经过Google决定采用流式读取对sql进行优化。jdk1.8 、intellij IDEA 2018
mybatis 3 、 springMVC 、Spring 4
实现流式读取的方式不止一种,但是我只能说我解决的这种,对不起,我不是大神级的。
这里采用的 controller、service、dao分层开发
为什么dao返回值为void还要在mapper写resultMap?因为回调要用你的resultMap处理,但是不应该返回给service,因为回调处理好了
controller层:
service层:(重点)
dao层:(重点)
mapper:(重点)
个人原因:删除非关键部分代码。你肯定看的懂得。
Google了好久的一个原因,就是因为dao接口不应该返回值的。还麻烦了老大过来看了一眼。
还有就是google出来的那些,要改框架配置的,我的确跟着改了,改了mysql连接参数,还有mybatis setting的配置。嗯,没用。
java性能优化之HashMap,LinkedHashMap,TreeMap读取大量数据效率的比较
很多时候,我们用jdbctemplate或mybatis的时候,为了查询通用,会选择使用map数据结构,因为hashmap本身无序,所以为了保证key的有序性,会采用linkedhashmap。所以我们要看一下Linkedhashmap的性能影响多大。如下:
@Test public void test() { Integer count =1000000; Random random =new Random(); Map<String, String> map = new HashMap<String, String>(); for (int i = 0; i < count; i++) { map.put(i+"", i+""); } long time1 = System.currentTimeMillis(); for (int i = 0; i < count; i++) { map.get((random.nextInt(count)+1)+""); } long time2 = System.currentTimeMillis(); System.out.println("HashMap time:" + (time2 - time1)); //////////////////////////////////////////////////////////////////////// Map<String, String> linkedMap = new LinkedHashMap<String, String>(); for (int i = 0; i < count; i++) { linkedMap.put(i+"", i+""); } time1 = System.currentTimeMillis(); for (int i = 0; i < count; i++) { linkedMap.get((random.nextInt(count)+1)+""); } time2 = System.currentTimeMillis(); System.out.println("LinkedHashMap time:" + (time2 - time1)); //////////////////////////////////////////////////////////////////////// Map<String, String> treeMap = new TreeMap<String, String>(); for (int i = 0; i < count; i++) { treeMap.put(i+"", i+""); } time1 = System.currentTimeMillis(); for (int i = 0; i < count; i++) { treeMap.get((random.nextInt(count)+1)+""); } time2 = System.currentTimeMillis(); System.out.println("TreeMap time:" + (time2 - time1)); }
执行结果:
HashMap time:641 LinkedHashMap time:703 TreeMap time:4040
读取数据是有序,则如下:
@Test public void test2() { Integer count =1000000; Random random =new Random(); Map<String, String> map = new HashMap<String, String>(); for (int i = 0; i < count; i++) { map.put(i+"", i+""); } long time1 = System.currentTimeMillis(); for (int i = 0; i < count; i++) { map.get(i+""); } long time2 = System.currentTimeMillis(); System.out.println("HashMap time:" + (time2 - time1)); //////////////////////////////////////////////////////////////////////// Map<String, String> linkedMap = new LinkedHashMap<String, String>(); for (int i = 0; i < count; i++) { linkedMap.put(i+"", i+""); } time1 = System.currentTimeMillis(); for (int i = 0; i < count; i++) { linkedMap.get(i+""); } time2 = System.currentTimeMillis(); System.out.println("LinkedHashMap time:" + (time2 - time1)); //////////////////////////////////////////////////////////////////////// Map<String, String> treeMap = new TreeMap<String, String>(); for (int i = 0; i < count; i++) { treeMap.put(i+"", i+""); } time1 = System.currentTimeMillis(); for (int i = 0; i < count; i++) { treeMap.get(i+""); } time2 = System.currentTimeMillis(); System.out.println("TreeMap time:" + (time2 - time1)); }
HashMap time:297
LinkedHashMap time:203
TreeMap time:438
从上可知,LinkedHashMap是可以完全代替HashMap的,不用担心性能问题。
以上是关于效率杠杠的!读取大量MySQL数据,就用Mybatis 流式的主要内容,如果未能解决你的问题,请参考以下文章