2 fnzf14428547 fnzf14428547 于 2016.02.03 15:06 提问

代码需要优化!!!!!!
public void exportArrearDatail(HttpServletRequest request, HttpServletResponse response){
    String templateId = request.getParameter("templateId");
    String fileNames = request.getParameter("fileName");
    String fileName = null;
    try {
        fileName = java.net.URLDecoder.decode(fileNames, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    String areaId = request.getParameter("areaId");
    String dataType = request.getParameter("dataType");
    ExcelUtil excel = new ExcelUtil();
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("templateId", templateId);
    if (areaId != null && !areaId.equals("")) {
        map.put("areaId", areaId);
    }
    if ("effective".equals(dataType)) {
        map.put("effective", "'有效'");
    }
    excel.createBookAndSheet(false, "sheet1");
    excel.writeRow(0, "查询号码", "设备状态", "商品名称", "欠费账龄", "欠费金额",
            "计费类型", "计费标签", "家长姓名", "区域名称", "学校名称", "班级名称", "学生姓名",
            "计费号码", "登录账号");

    int count = arrearAnalysisService.countUserNum(map);
    if (count > 0) {
        List list = new ArrayList();
        ArrearInfo arrearInfo = null;
        int rowNum = 1;
    //就是下面这个循环
    //我试了下就是参数里面的10000是每页显示的数字,如果超出10000它也不会生成第二页
    //用什么值能替换它让它不是固定的 ,而是跟着总数走的
        for (int row = 0; row < count/10000; row += 10000) {
            Page<ArrearInfo> page = arrearAnalysisService.getArrearInfoByPage(map, row*10000, 10000, "arrearAmount", SqlOrderEnum.DESC.getAction());
            list = page.getList();
            for (int i = 0; i < list.size(); i++) {
                arrearInfo = (ArrearInfo) list.get(i);
                if (arrearInfo == null) {
                    break;
                }
                excel.writeRow(rowNum++, arrearInfo.getPhoneNumber(), arrearInfo.getDeviceStatus(), arrearInfo.getGoodsName(), arrearInfo.getArrearAge(),
                        arrearInfo.getArrearAmount(), arrearInfo.getBillingType(), arrearInfo.getBillingLabel(), arrearInfo.getUserName(),arrearInfo.getAreaName(),
                        arrearInfo.getShoolName(), arrearInfo.getClassName(), arrearInfo.getStudentName(), arrearInfo.getPayNumber(), arrearInfo.getLoginNumber());
            }
        }
    }

    Runtime.getRuntime().gc();
    DownloadUtil.downloadXlsx(response, fileName + "用户信息", excel.getInputStream());
}

4个回答

caozhy
caozhy   Ds   Rxr 2016.02.03 18:19

arrearAnalysisService.getArrearInfoByPage
不要一下读取那么多的记录,这样导致内存不够。

你的page可以小一些,然后多循环几次。比如pagesize/100,内侧循环再来个100

fnzf14428547
fnzf14428547 不行啊,我也不知道我写的对不对,反正还是老样子
2 年多之前 回复
fnzf14428547
fnzf14428547 现在内存不溢出了,就是点导出要等好久才能出现下载
2 年多之前 回复
Yiran8935
Yiran8935   2016.02.03 15:17

这个跟数据量有没有关系,EXCEL的最大储存行数为65536行,你看看有没有超过,还有先用小于万件的数据调试下,看有没有内存溢出的情况发生

fnzf14428547
fnzf14428547 我们最大的数据是5w多,不过我改了下代码,现在可以导出了,不过要等很久才能出现下载
2 年多之前 回复
fnzf14428547
fnzf14428547 回复Yiran8935: 就是点导出excel我刚才试了下14000的数据还可以,但是要等好久才能出现下载,估计数据在大一点网页就报错了,log上没报错
2 年多之前 回复
Yiran8935
Yiran8935 回复fnzf14428547: 有没有报错信息,是哪一行报错之类的,多上log啊
2 年多之前 回复
fnzf14428547
fnzf14428547 没有超过65536行,小的也不行,直接就报500错误,内存溢出
2 年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2016.02.03 16:22

内存溢出是不是你操作excel的函数调用就不正确,比如你只写入10条数据试试呢,逐步增加,看是否有一个一个门槛数据

fnzf14428547
fnzf14428547 14000条可以导出的,反应速度很慢,具体多大会内存溢出我还没试出来
2 年多之前 回复
91program
91program   Ds   Rxr 2016.02.03 16:12

数据库太大,依赖于优化循环是提高不了性能的。
如果代码段功能正常,可以考虑将之放在线程中,这样可以在处理数据的过程中继续响应用户操作。

91program
91program 回复fnzf14428547: 不会就使用搜索引擎啊,如:Baidu/Bing。只要你会使用它,很多问题都可以解决的。
2 年多之前 回复
fnzf14428547
fnzf14428547 可是我不会放入线程中啊
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
项目开发中遇到的一些问题--代码优化的一些小建议
一.string非空验证 第二种方法加+“”是为了当str为null时的验证 二.bool返回值 if(i==1){ return true;}else{return false;} i==1?true:false   运用三元符节省代码
引用 写给想用汇编优化程序的程序员朋友们
我是引用别人的文章,但是也谈一点自己的看法。我有些观点是与作者不同的。 1. 在现在的这个时代,学习汇编的主要目地是能读得懂汇率代码,这对于理解系统底层的工作机制有好处,而了解底层的软件工程师更易于写出高效的代码。 2.编译理论已经发展几十年,想用汇编来优化代码运行速
数学建模最优化方法模型及算法程序实现
数学建模最优化方法模型及算法程序实现,这是我参加数学建模常用的模型,与大家共享之
代码性能优化建议
编写:kesenhoo - 原文:http://developer.android.com/training/articles/perf-tips.html 这篇文章主要介绍一些小细节的优化技巧,虽然这些小技巧不能较大幅度的提升应用性能,但是恰当的运用这些小技巧并发生累积效应的时候,对于整个App的性能提升还是有不小作用的。通常来说,选择合适的算法与数据结构会是你首要考虑的因素,在这篇文章中
优化代码的几个技巧
无意看到一篇小短文,猜测作者应该是一个图形学领域的程序员或专家,介绍了在光线(射线)追踪程序中是如何优化C/C++代码的。倒也有一些参考意义,当然有的地方我并不赞同或者说我也不完全理解,原文在此,我的粗糙翻译如下: 1. 牢记Ahmdal定律                    funccost表示是函数func的运行时间百分比,funcspeedup是你优化后函数的运行系数;
35 个 Java 代码性能优化总结(一)
前言 代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每
WebView的使用与优化
文章出处:http://www.dengzhr.com/others/mobile/695 Android中的WebView组件本身就是一个浏览器实现。Android 5.0增强的WebView基于Chromium M37,直接支持WebTRC、WebAudio和WebGL。Chromium M37也包括对Web组件规范的原生支持,如自定义元素、阴影DOM、HTML导入和模板,这意味这开
JS代码优化的几种方式
如果你问我网站中最影响网站打开速度的是什么?我会告诉是网站中的javascript,简称JS。模板中引用的JS文件越多,打开速度越慢,这点我深有体会,不信你看看卢松松博客首页,使劲优化后依然有100K的文件。细读完这篇文章,够你优化大半天的了,关于JS优化方法大都脱离不了这三种方法。 (网页总大小为155.k,而JS就占了100.3K) 是时候优化下JS了 关于JS优化的
代码优化等级带来的问题
今天在使用mdk编写stm32f103的程序的时候,写了几个嵌套的if判断,但是在运行程序的时候出现了一些问题,用仿真器进行仿真的时候有几条指令不能运行,总是调过这些指令执行别的。通过自己的查找,最终找到了带来这种错误的来源,   对于代码的优化级别太高了 在设置中选择上图中的优化级别,原先设置的优化级别是-O3,一些代码在进行优化的时候被精简掉了,通过修改这个等级为-O0,就可以执行你编写的每
C#代码精简优化技巧总结
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 在我们写代码的时候可以使用一些小的技巧来使代码变得更加简洁,易于维护和高效。 1 .空操作符(??) 在程序中经常会遇到对字符串或是对象判断null的操作,如果为null则给空值或是一个指定的值。通常我们会这