java从oracle中读取大量数据写出到文件

java从oracle中读取大量数据写出到文件

背景:项目中需要从oracle中读取表字段并以指定间隔符拼接字段,输出到txt。每张表的数据量大概在2000W左右,因为是只需要读一张表指定字段的全部数据,也不需要考虑查询优化,只针对表读取规模进行优化即可。

版本oracle 11G

思路一:

使用oracle语句对数据表进行分页读取,这里应注意到的是rowid效率和rownum效率问题,还有使不使用order by


SELECT t.*
  FROM a t, (SELECT ROWNUM rn, c.*
                  FROM (SELECT   ROWID k
                            FROM a
                        ORDER BY ID) c) b
WHERE t.ROWID = b.k AND b.rn BETWEEN 10001 AND 20000;

有一篇对比文章,大家可以看一下 http://www.itpub.net/thread-1603830-1-1.html

这个思路对我的需求来说也不太适合,分页读取确实缩短了查询时间,但是对于上千万的大表来说,越往后分页花的时间越长,整体来说效率提升不多大。

思路二:

在写数据时,使用多线程,提升写的效率,测试证明,我的效率瓶颈是在读取数据方面,不是写数据方面。

思路三:

使用ResultSet对结果集进行分批读取,开始的时候没想到ResultSet直接支持了分批读取,在前面两个思路上花费了不少时间。

先讲解下再贴代码
ResultSet的常见用法:点击跳转查看

大多数文章知识讲解了常见方法及参数的设定,ResultSet的setFetchSize()setMaxRows() 缺很少有人提及

简单来说
setFetchSize()  :是设置ResultSet每次向数据库取的行数 

例如:rs.setFetchSize(100),ResultSet每次向数据库读取100条数据,
之后下一百条数据的读取是在ResultSet内部完成的,不需要手动去进行调用或定位数据从哪行开始。

setMaxRows() :是设置Resultset最多返回的行数,不需要读取全部数据,只要特定行数的数据,可以选择此方法。

有篇文章里分析的还算可以:
JDBC读取数据优化setFetchSize
JDBC读取数据优化-fetch size

另外如果设置的

stmt = destCon.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

可能会报这个错
在这里插入图片描述

这时需要把 
ResultSet.TYPE_SCROLL_SENSITIVE
改为
ResultSet.TYPE_SCROLL_INSENSITIVE,

下面贴上我的代码


public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {
   

        String selsql;
        Connection destCon = null;
        Statement stmt = null;
        BufferedWriter outpu
  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值