我写了个程序,每天根据一个报表的5w行数据更新数据库中的5w条记录,
目前的做法是 每读报表的一行,就用Hibernate load出一行数据,更改后再update到数据库中,执行速度是每秒20条数据,更新5w行记录耗时约40分钟
这个速度貌似不够快,估计主要是查询太耗时了——5w次搜索一个5w行记录的数据库表
现在我想一次把这5w行数据装载到HashMap中,这样也许就免去了这5w次IO操作有三个问题想请教大家——
1. 我这种方法是否合理?
2. 如何装载出这5w条数据?我用 Iterator it = session.createQuery("from Product p ").list().iterator(); 非常耗时,15分钟这条语句都没执行完成
3. HashMap能容纳下5w条记录吗?
目前的做法是 每读报表的一行,就用Hibernate load出一行数据,更改后再update到数据库中,执行速度是每秒20条数据,更新5w行记录耗时约40分钟
这个速度貌似不够快,估计主要是查询太耗时了——5w次搜索一个5w行记录的数据库表
现在我想一次把这5w行数据装载到HashMap中,这样也许就免去了这5w次IO操作有三个问题想请教大家——
1. 我这种方法是否合理?
2. 如何装载出这5w条数据?我用 Iterator it = session.createQuery("from Product p ").list().iterator(); 非常耗时,15分钟这条语句都没执行完成
3. HashMap能容纳下5w条记录吗?
解决方案 »
- java中如何手动停止一个已经start的线程
- 使用Runnable接口的方法实现多线程
- 汉字问题
- 写一个JFrame小应用程序,大家帮帮我啊!谢
- 关于 java -verbose:gc参数的问题(在线等待,立刻给分)
- 高分咨询,看书说java非0长度的数组都是可变的,不能理解,难道不是在堆里一次分配好固定大小的吗?
- 同一个包中的文件中公有的类访问出错!求救
- 急求助!怎样解决无法实例化?
- 用jbuilder开发weblogic的CMP的问题
- 用javamail做了一个application,在jBuilder中很好,可是生成jar后,却不能单独运行,why?
- final关键字与java性能优化
- java命令编写
2、for each()循环
3、HashMap可以容纳下5w条记录
不过一次装5W条没必要
2 2个线程线程,一个线程读取报表记录,一个线程根据报表记录回写数据库我倾向于选择方案2
2、这种事情最好就不要让HIBERNATE做,直接用JDBC
3、硬要用HIBERNATE,那么最好分批进行
昨天后来发现,查询慢的原因是我的hql语句里用了左连接 Iterator it = session.createQuery("from Product p left join fectch .... ").list().iterator();
改成 from Product p 就好了
装载5w条记录的时间为81秒,遍历更新这5w条记录的时间为17秒(其实是少量更新,并不是5w条都更新)
时间比原来的2400多秒提高了2个数量级但是,在家里的机器上试的时候就OutOfMemory了
所以看来这种情况还是一块一块的加载吧
我以前做过根据一个Txt文件更新数据库的程序.大概几千条数据,就用我上面的方法.基本上是秒级的就更新好了.
用过11000*11000的二维数组,再想搞个这么大的数组,就要经历漫长的等待
还没找到少等点的解决方法
还是不要占太多内存的好
1、永远不要一次性把成万行记录搞到内存中,这是一个戒律
2、这种事情最好就不要让HIBERNATE做,直接用JDBC
3、硬要用HIBERNATE,那么最好分批进行