private static void initSrcCols(ResultSet rs) throws SQLException
{
long tt;
tt=System.currentTimeMillis();
servicekey = rs.getInt(1); //servicekey
callcost = rs.getInt(2); //callcost
callee = rs.getString(3); //callee
caller=rs.getString(4); //caller
t1=t1+System.currentTimeMillis()-tt;
tt=System.currentTimeMillis();
if(caller.startsWith("010"))
caller=caller.substring(3,caller.length());
t2=t2+System.currentTimeMillis()-tt;
tt=System.currentTimeMillis();
chargemode=rs.getInt(5); //chargemode
cardid=rs.getString(6);
called=rs.getString(7);
t3=t3+System.currentTimeMillis()-tt;
tt=System.currentTimeMillis();
if(called.startsWith("010"))
called=called.substring(3,called.length());
t4=t4+System.currentTimeMillis()-tt;
tt=System.currentTimeMillis();
startdateandtime=rs.getString(8); //startdateandtime
stopdateandtime=rs.getString(9); //stopdateandtime
duration=rs.getString(10); //duration
chargeclass=rs.getInt(11); //chargeclass
typeOfTraffic=rs.getInt(12); //typeOfTraffic
t5=t5+System.currentTimeMillis()-tt;
}
public static void main(String[] args)
{
......
icnt=0;
while(rs.next())
{
icnt=icnt+1;
l4=System.currentTimeMillis();
initSrcCols(rs);
linitSrcCols=linitSrcCols+System.currentTimeMillis()-l4;
if(icnt%10000==0)
{
System.out.println("t1 = "+t1);
System.out.println("t2 = "+t2);
System.out.println("t3 = "+t3);
System.out.println("t4 = "+t4);
System.out.println("t5 = "+t5);
System.out.println("linitSrcCols = "+linitSrcCols);
t1=0;
t2=0;
t3=0;
t4=0;
t5=0;
linitSrcCols=0;
}
}
}
执行结果如下:
-------------Time Used Summary-------------
<< At 20050908082659 : t1 = 2213
t2 = 32
t3 = 800
t4 = 10
t5 = 3102
Processed 10000 records
linitSrcCols = 6230
-------------Time Used Summary-------------
-------------Time Used Summary-------------
<< At 20050908082711 : t1 = 2653
t2 = 24
t3 = 911
t4 = 9
t5 = 1922
Processed 20000 records
linitSrcCols = 5539
-------------Time Used Summary-------------
-------------Time Used Summary-------------
<< At 20050908082724 : t1 = 2211
t2 = 14
t3 = 1086
t4 = 3
t5 = 2809
Processed 30000 records
linitSrcCols = 6137
-------------Time Used Summary-------------
-------------Time Used Summary-------------
<< At 20050908082803 : t1 = 6640
t2 = 9
t3 = 7067
t4 = 8
t5 = 6902
Processed 40000 records
linitSrcCols = 20644
-------------Time Used Summary-------------
-------------Time Used Summary-------------
<< At 20050908082850 : t1 = 10045
t2 = 9
t3 = 5040
t4 = 6
t5 = 10039
Processed 50000 records
linitSrcCols = 25153
-------------Time Used Summary-------------
-------------Time Used Summary-------------
<< At 20050908082942 : t1 = 7272
t2 = 8
t3 = 8923
t4 = 1
t5 = 14992
Processed 60000 records
linitSrcCols = 31210
-------------Time Used Summary-------------
-------------Time Used Summary-------------
<< At 20050908083035 : t1 = 9120
t2 = 8
t3 = 11011
t4 = 2
t5 = 13179
Processed 70000 records
linitSrcCols = 33337
-------------Time Used Summary-------------
-------------Time Used Summary-------------
<< At 20050908083129 : t1 = 10056
t2 = 4
t3 = 6959
t4 = 3
t5 = 13177
Processed 80000 records
linitSrcCols = 30214
-------------Time Used Summary-------------
越到后面,linitSrcCols的值越来越大,但基本在30-40之间,请问有什么办法可以减小运行时间?
应该只取你要的数据,一般来说,人只会看前面的部分数据,所以一次只输出用户要的数据,其它的数据通过翻页来查看。
这个东西无所谓了,估计你的程序是一次性导入,又不是定时任务,没关系了,只要做好事务控制,别的都无所谓了。至于rs.getString等,是jdbc的东西,你无法改了,最多改改startsWith,可以用charAt来替换,或者把你做处理的部分进行优化。
采用翻页,每次只查询不超过固定大小数量的数据
我这可不是用来做网页的,而是从一个远程的informix数据库中去把一个大表[1千万]里的数据取下来,
做一些处理之后,存到本地Oracle数据库.
其实,你还是可以每次取几百条记录,然后将这些记录插入Oracle,多做几次就好了.
一起取的话,你的程序运行的时候的堆空间不够,这个是java.lang.OutOfMemoryError出现的原因
最好,插入几百条做一次提交,要不数据库的回滚段也容易出问题
一千万的数据如果你select *,如果不出OutOfMemoryError才怪。你的jvm内存不够了啊,你可以参考oracle的rownum方式,每次取1000条,下次取1000-2000,2000-3000,依次下去,把每次执行后的数据记录所在位置记录下来,以便操作中突然当机,可以从该处继续运行。
至于效率,利用jdbc取数据,最多就是select的优化,以及存入数据库时的addBatch,别的就谈不上什么东西了。
注意,你可以设置不返回消息
因为每执行一条SQL语句就会向服务器返回一个消息,你可以去设置的
在你的大表那端写Store Procedure了
如果数据太多,考虑在服务器定时执行导入了
如果判断太多,SQL查询数据,一次送入HashMap,然后循环判断取数据导入了
你说的OutofMemory是ResultSet数据太多缘故,做分页处理
千万条一次放到内存里真是难以想象。
还不是建个结构完全相同的临时表,
分页处理存入临时表, 所有处理完成再导入到目标表中,
这样失败了也不浪费时间,千万条的数据应该用上了分区表这类的功能吧,可以分区检索数据,
ROWID 也能用上来。