java的rs.next()当数据量到10万以上的时候会很慢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的rs.next()当数据量到10万以上的时候会很慢?相关的知识,希望对你有一定的参考价值。

表一共有350万数据,
我分页拉数据,每次拉10万数据,然后用rs.next()遍历,存到arraylist里面去,经过处理后再插入另外一个表。
现在的情况是:rs.next()遍历1万条数据大概需要40s到60s左右,10万条大概需要7分钟到10分钟,实在是太慢了。光遍历350万数据就需要4个小时多了啊。。
注意,这时间不算上从数据库里拿到内存里的时间。
点追问没反应。。
===========================================
rs.next() 一个循环做了下面的事情,
new一个bean(只有6个属性),
判断其中2个字段是否为空,如果空就continue,
不为空就把6个字段的值放到bean里面。
把bean用arraylist。add追加。
================================================
我的问题和拉数据,插数据都没有任何关系~~~
我的问题和拉数据,插数据都没有任何关系~~~
我的问题和拉数据,插数据都没有任何关系~~~

谢谢。。。
while(rs.next()
rs.getstr() 6个字段
判断其中2个字段是否为空,如果空就continue,
new一个bean(只有6个属性)
set value到 bean里面
arraylist.add追加bean

参考技术A 看到上面说批量处理的回答我蛋碎了一地......
这明显是读取数据,而不是写入数据库,怎么批处理?
你想知道他的效率,可以写代码测试一下,或者去分析他的源码
//---------------------------------------
根据你的补充,你是想从原表中抽出部分列组成一个新表。
感觉类似于创建视图。
你去了解一下数据库的命令,貌似有类似命令。
直接在数据库里面执行,通过JDBC会有个IO过程和CPU的处理过程,效率肯定降低。追问

哦,不是view哦,原表和新表不在同一个db里面。。。
我这里没有算io的时间。仅仅在内存里遍历。。。

追答

你是说你没有计算读取时间和写入新表时间。只是在内存中遍历10W条数据就用了7-10分钟?
说实话,没我做过这方面的测试。不知道ResultSet从表中获取10W条数据要多少时间
不过只是遍历10W条数据估计就几秒,7-10分钟难以置信。
你写入新表的时候用批处理。比如1000条写入一次。

追问

是的,在内存中遍历resultset的10W条数据就用了7-10分钟。
插数据时用批处理的。 我用for循环10万次 才45毫秒呢。。。

我的问题和拉数据,插数据都没有任何关系~~~
我的问题和拉数据,插数据都没有任何关系~~~
我的问题和拉数据,插数据都没有任何关系~~~

参考技术B 数据库读取应该没那么慢,你不会是一条一条读的吧?另外存进list是直接add的么?
另外看你好像是纯数据处理直接sql语句如何?

//
你要处理什么呢?sql语句基本都能处理,有时只是会太慢或表太大才要读进内存去做,如果只是简单的处理还是直接sql快追问

谢谢关注,你是不是没有了解我的问题。
我的问题是java的问题。
请看我对问题的补充。
我是用sql一次啦10万条数据到resultset里面,到了内存里我才开始计时。
list的add方法有什么问题嘛?

追答

我的意思是你可能可以用sql就能简单地完成,不一定非要读出来才能解决你要完成的事。
既然你读入内存后才计时,那就是大量时间都用在创建bean对象上了。尽量用简单数据类型吧

追问

创建bean对象用的时间是0毫秒

参考技术C 这个明显是你本机处理器问题了,看你处理的都是倍数级增加,提升你硬件设备才是关键了 参考技术D 你为啥一次要处理十万条数据呢? 真有这么多数据的话,为什么不在存储过程里处理呢,非要在java端循环处理呢。想不通。。。
用存储过程处理吧。 就不会拉到服务端了。

哎一条SQL语句就可以做完的事,还非拉到服务端去循环,有必要么?追问

多谢回答。
拉出来6个字段是要用处理才插入到另外一个表的,存储过程处理不了吧。

第5个回答  2012-06-07 一次处理10万太多啊,可以批量

java如何读取mysql中的text类型的数据。

我在数据库中有一text类型的字段为content.当我存有内容在content中,执行
if(rs.next())rs.getString(1);正常。但是如果我没有存放内容,
if(rs.next())依然可以执行,不过此时执行到rs.getString(1)就会出现异常(我明白因为此时rs应该为null),但我不明白为什么if(rs.netx())仍可执行,我的content内容不是null吗?

java mysql 数据类型对照:

对于bolb,一般用于对图片的数据库存储,原理是把图片打成二进制,然后进行的一种存储方式,在java中对应byte[]数组。
对于boolen类型,在mysql数据库中,用int类型代替较好,对bit操作不是很方便,尤其是在具有web页面开发的项目中,表示0/1,对应java类型的Integer较好。

参考技术A rs.next仅仅是记录集指针移到下一条记录,只要这条记录存在就OK,不会关心你那条记录的某个字段有没有东西,除非到达了所有记录的末尾返回eof了才会为false。
rs.getString(1)的时候发现字段值为空,当然就异常了,所以可以这样写试试:
if(rs.next() && rs.getString(1) )rs.getString(1);

以上是关于java的rs.next()当数据量到10万以上的时候会很慢?的主要内容,如果未能解决你的问题,请参考以下文章

java 怎么分页?

Jsp--java.sqlsqlException结果集已耗尽

java如何读取mysql中的text类型的数据。

oracle数据库java.sql.SQLException: 结果集已耗尽,总是跳不出while(rs.next())循环,请求高手帮忙解决!

如何避免 ResultSet 是 Java 中的关闭异常?

Servlet 连接数据库 报错500(下图) 这个怎么解决?