近一个月的工作学习总结

 利用POI进行EXCEL报表导出。   

    可以参考该博客 地址,我们在服务器端做好模板,然后读取模板,根据所需内容进行插入。对应模板存放的路径,放到conf目录下。

我之前读取模板所在路径的方法为:      

private  URL url  = this.getClass().getClassLoader().getResource("com/srx/zservice/excel/");
private String fileToBeRead=url.getPath()+"memberCount.xls";
    部署到linux服务器上,报空指针异常。原因分析如下:

Windows下可以用‘/’,linux下不识别。换为‘//’形式,结果仍为空指针异常。

改变方法为:

InputStream is = ExportPersonExcel.class.getResourceAsStream("/person.xls");
// 创建对Excel工作簿文件的引用
HSSFWorkbook workbook = new HSSFWorkbook(is);
问题解决。
     导出报表较为麻烦的是,报表的动态生成,如Excel中某些行是可变长的,需要根据数据多少动态生成。

              

关于报表导出,其余的处理比较简单了,待填充的数据,现在模板上写入相关数字。读取模板,利用switch case语句,根据不同数字,进行相应的插入


根据action_log进行数据统计,并进行数据优化

     测试库中,每天需要进行处理的数据达5万,分别需要进行近20万次查询和3万次插入。5000个用户,单个用户35次查询,和4次插入。

数据一,采用多线程在我机器中跑完全部用时:1832531微秒,合计30.54分钟。
数据二,加上个人月度统计表,增加了1万次查询,1万次插入,跑完全部用时43分钟。
数据三,将统计代码放到服务器中跑,最快117秒跑完全部,最慢3分钟跑完,可以得出服务器内存大,运行速度明显提高。
得到的经验教训有:
       1,进行减少数据查询次数,数据库的连接关闭会耗费比较长的时间。
       2,UNION ALL查询语句会减少查询次数,而且不会耗费时间。SQL查询语句决不能嵌套,或者使用IN查询,否则极其影响效率,成为性能瓶颈。尽量减少多表联合查询。
       3,采用数据库连接池,可大幅度提高数据库利用效率。
       4,提高查询效率,可创建普通索引。
 ALTER TABLE zpersonal_count ADD INDEX index_userid(userid)
      5,统计代码存在优化空间,可利用group by查询,将同意业务逻辑利用group by 查询,group by userid,将查询结果存储到List<Map(key,value)>中,可大幅度检查查询次数。
      6,数据库建表,采用ENGINE=InnoDB,MYSQL默认的方式为MYSAM,MYSAM效率比较高,但是可能会引起锁表,推荐采用引擎为InnoDB。
其他的方面有:1,SQL注入问题
        
"SELECT count(*) FROM action_log WHERE  targetType=10 AND optionType=10 "+ "AND userId= "+ userid+ " AND groupId= "+ groupid+ " AND ctime between "+ startDateTime+ " AND " + endDateTime);		

采用上述方式,存在SQL注入问题,应该使用预编译形式:

SELECT COUNT(*) FROM  zpersonal_count WHERE groupid=?"+ " AND ctime between " + startDateTime + " AND " + endDateTime;
	prep = conn.prepareStatement(sql);
	prep.setLong(1, groupId);
	rst = prep.executeQuery();			
2,另外写代码要进行规范化,注意逻辑清晰,考虑代码的可维护性,可扩展性。

3,对于有问题的模块,要养成加日志的好习惯。方便可以对日志进行分析。,

4,出现异常要进行捕捉,不能抛出异常。

  

 


       

你可能感兴趣的:(近一个月的工作学习总结)