问题是这样的
List erpBomList = erpBomMapper.getERPBomList();
这个是在取得ERP中的BOM,数据量是40W,因为需要做迭代,所以需要一次全部取出,现在用的是ibatis
/**
* 得到ERPBOM的列表
* @return
*/
@Select("SELECT REPLACE(MITM,' ','') as mitm,REPLACE(SITM,' ','') as sitm,QANA as qana,REPLACE(NNTS,' ','') as nnts,REPLACE(CWAR,' ','') as cwar,REPLACE(GS,' ','') as gs FROM ERP_BOM WHERE REPLACE(MITM,' ','')is not null AND REPLACE(SITM,' ','')is not null AND QANA IS NOT NULL AND QANA <>0")
List getERPBomList();
问题就是速度慢,有人提议用jdbc
Connection conn = mesBomdao.getCurrentSession().connection();
但是ibatis底层不就是jdbc的封装吗,会提高速度吗,
还是用Hibernate,最好说出为什么,谢谢
使用JDBC,自己控制数据到对象的转换时机和存储方式;而ORM框架不受代码控制。ORM框架多数都不是为了这种数据量设计的。
建议可以采用Nosql或者采用后台定时生成的方案处理。
1 读取出来的字段尽量不要太多,用不到的就不用读取出来
2 select REPLACE 可以使用case来做
3 WHERE REPLACE(MITM,' ','')is not null AND REPLACE(SITM,' ','')is not null ,这里我觉得有问题。你都替换为''了,肯定是 is not null,先仔细检查下sql,看看是否是最好的。
jdbc肯定会比Ibatis快的,但是也快不到很多的。
40w条数据,一般来讲也就占用几百兆内存,这应该不是太大问题。iBatis和Jdbc是一样的,效率上不会有什么差别。如果能够每次只提取一部分数据(比如1w)做循环,那显然内存占用就好控制多了。其实数据库的批量提交也是这么控制的,Oracle默认每1千条提交一次。