求大神解决下问题

被窝式覆盖 2014-12-18 10:00:24
我是使用form表单提交到后台,然后导出excel。现在的问题是多次点击下载导致内存溢出。因为没有返回值也不好添加遮罩层。感觉是因为tomcat的内存不足导致的。请问有什么解决方法么?
...全文
154 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shixitong 2014-12-18
  • 打赏
  • 举报
回复
引用 5 楼 f13998214847 的回复:
[quote=引用 2 楼 shixitong 的回复:] 这种情况就算调大内存,估计还是会出现内存溢出,看看是不是哪边内存泄漏 用工具看看,比如memory-analyzer
单次下载没有问题的,就是多次点击下载导致内存溢出的。[/quote] 你这个多次下载是指: 1、第一次下载正常、第二次下载正常……然后第n次下载包内存溢出? 2、第一次没有下载完就又开始点击下载? 如果是第一种情况,那还得去检查代码 如果是第二种情况,在前台可以选择用ajax的方式请求下载,这样就可以做一个遮盖层或者把按钮置灰,等下载完成再去掉遮盖层或者恢复按钮,这样界面也友好,否则用户不知道什么时候下载完
被窝式覆盖 2014-12-18
  • 打赏
  • 举报
回复
引用 2 楼 shixitong 的回复:
这种情况就算调大内存,估计还是会出现内存溢出,看看是不是哪边内存泄漏 用工具看看,比如memory-analyzer
单次下载没有问题的,就是多次点击下载导致内存溢出的。
被窝式覆盖 2014-12-18
  • 打赏
  • 举报
回复
引用 3 楼 WLLX623 的回复:
控制下下载按钮,只有在完成下载之后才能再去点击下载按钮。 比如添加dialog 提示【正在下载请等待】 这种情况跟你的代码应该没什么关系,属于错误操作导致的。
但是form没有返回值啊,怎么知道已经导出完成?
翘班党 2014-12-18
  • 打赏
  • 举报
回复
控制下下载按钮,只有在完成下载之后才能再去点击下载按钮。 比如添加dialog 提示【正在下载请等待】 这种情况跟你的代码应该没什么关系,属于错误操作导致的。
shixitong 2014-12-18
  • 打赏
  • 举报
回复
这种情况就算调大内存,估计还是会出现内存溢出,看看是不是哪边内存泄漏 用工具看看,比如memory-analyzer
被窝式覆盖 2014-12-18
  • 打赏
  • 举报
回复
导出代码:
private void exportSummarydataDetailAction(String companyid,int basenumber,HttpServletRequest request,HttpServletResponse response)throws ApplicationException{
		//组织日期信息
		boolean sign = request.getParameter("flag1") != null ? true : false ;
		String monthstr = sign ? request.getParameter("monthid1") : request.getParameter("monthid2");
		String flag = sign ? request.getParameter("flag1") : request.getParameter("flag2");
		
//		String monthstr1 = request.getParameter("monthid1");
//		String monthstr2 = request.getParameter("monthid2");
//		String flag1 = request.getParameter("flag1");
//		String flag2 = request.getParameter("flag2");
//		String monthstr = monthstr1!=null?monthstr1:monthstr2;
//		String flag = flag1!=null?flag1:flag2;
		
		NumberFormat formatter = NumberFormat.getNumberInstance();
		formatter.setMinimumIntegerDigits(2);
		formatter.setGroupingUsed(false);
		Calendar calendar = Calendar.getInstance(Locale.CHINESE);
		int intMonth =calendar.get(Calendar.MONTH)+1;//当前月
		int intYear =calendar.get(Calendar.YEAR);//当前年
		//公司名称
		String companyName = this.queryMenuService.getMontherCompanyName(companyid);
		//下载文件名
		String fileName = "";
		if (!"1".equals(flag)) {
			fileName = companyName+"_"+monthstr+"_office_billing.xls";
		}else {
			fileName = companyName+"_"+monthstr+"_billing.xls";
		}
		File file = new File(fileName);
		//创建excel
		WritableWorkbook book;
		List<String> monthList = new ArrayList<String>();

		try {
			book = Workbook.createWorkbook(file);
			if ("1".equals(flag)) {
				//第一sheet页:创建2014年汇总sheet页面
				monthList = this.createExcelSeet1(book, intYear, intMonth, companyid, basenumber);
				//第二sheet页:创建本年度各月按指令汇总sheet页面
			    this.createExcelSeet2(book, intYear, intMonth, companyid, basenumber,monthList);
				//第三sheet页:创建当月按日汇总sheet页面
			    this.createExcelSeet3(book, intYear, intMonth, companyid, basenumber,monthstr);
			}		     
		 	//第四sheet页:创建office明细sheet页面
		    this.createExcelSeet4(book,companyid, basenumber,monthstr);
			book.write();
			book.close();
			// 设置输出的格式
			response.reset();
			// added by zzy
			String postFix = fileName.substring(fileName.lastIndexOf(".") + 1);
			if (postFix.equalsIgnoreCase("xls")){
				response.setContentType("application/xls");
			}
			//根据浏览器设置下载文件名的编码
			if(request.getHeader("User-Agent").toLowerCase().indexOf("firefox")>0){
				fileName = new String(fileName.getBytes("UTF-8"),"ISO8859-1");
			}else if(request.getHeader("User-Agent").toUpperCase().indexOf("MSIE")>0){
				fileName = URLEncoder.encode(fileName, "UTF-8"); 
			}else{
				fileName = new String(fileName.getBytes("UTF-8"),"ISO8859-1");
			}
			  
			//设置下载文件头
			response.addHeader("Content-Disposition", "attachment; filename=\""
					+ fileName + "\"");
			//response.setContentLength((int)file.length());
			response.setHeader("Connection", "close");
			byte[] buffer = new byte[4096];
			BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));
			BufferedOutputStream outWrite = new BufferedOutputStream(response.getOutputStream());
			int n = -1;
		    //遍历,开始下载
		    while ((n = input.read(buffer, 0, 4096)) > -1) {
		    	outWrite.write(buffer, 0, n);
		    }
		    outWrite.flush();   //不可少
		    response.flushBuffer();//不可少
		    if (input != null){
		        input.close();
		    }
		   if (outWrite != null){
			   outWrite.close();
		   }
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
被窝式覆盖 2014-12-18
  • 打赏
  • 举报
回复
引用 6 楼 shixitong 的回复:
[quote=引用 5 楼 f13998214847 的回复:] [quote=引用 2 楼 shixitong 的回复:] 这种情况就算调大内存,估计还是会出现内存溢出,看看是不是哪边内存泄漏 用工具看看,比如memory-analyzer
单次下载没有问题的,就是多次点击下载导致内存溢出的。[/quote] 你这个多次下载是指: 1、第一次下载正常、第二次下载正常……然后第n次下载包内存溢出? 2、第一次没有下载完就又开始点击下载? 如果是第一种情况,那还得去检查代码 如果是第二种情况,在前台可以选择用ajax的方式请求下载,这样就可以做一个遮盖层或者把按钮置灰,等下载完成再去掉遮盖层或者恢复按钮,这样界面也友好,否则用户不知道什么时候下载完[/quote]但是不想改变提交方式,请问大神怎么才能知道下载完成这个状态

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧