JAVA程序怎样快速访问oracle数据库的一张大表

vvqboy 2014-11-06 12:30:44
JAVA程序怎样快速访问oracle数据库的一张大表
目前我需要读取oracle中的一张表(关键字:只读,一张表)。
但这张表里有3.5亿条数据。
读取后,需要对每一条数据做处理(可以理解为插入到一张链表里)。
内存够大,就是速度太慢。
整张表处理完毕,需要大概24小时的时间。
希望大家能帮忙共享下经验,在这种情况下,怎么写java代码,能把数据快速处理。
我目前用的是从网上随便找的,一个典型的jdbc读取oracle数据库的代码,单线程。
...全文
564 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lliiqiang 2014-11-25
  • 打赏
  • 举报
回复
用select语句.
vvqboy 2014-11-24
  • 打赏
  • 举报
回复
引用 11 楼 skgary 的回复:
[quote=引用 楼主 vvqboy 的回复:] JAVA程序怎样快速访问oracle数据库的一张大表 目前我需要读取oracle中的一张表(关键字:只读,一张表)。 但这张表里有3.5亿条数据。 读取后,需要对每一条数据做处理(可以理解为插入到一张链表里)。 内存够大,就是速度太慢。 整张表处理完毕,需要大概24小时的时间。 希望大家能帮忙共享下经验,在这种情况下,怎么写java代码,能把数据快速处理。 我目前用的是从网上随便找的,一个典型的jdbc读取oracle数据库的代码,单线程。
首先你要分析清楚你目前问题的原因是什么 是插入的慢,读取的慢,还是分析的慢。 第二步,才是确认大致的方案,如果是插入的慢,估计多线程也不会快,那你就要想办法先解决插入速度的问题。 [/quote] 目前只是遍历,还没设计到插入呢。 用jdbc的ResultSet.next() 方法遍历结果集,把结果封装到对象中。就完事了,还没插入,就很慢了。
skgary 2014-11-19
  • 打赏
  • 举报
回复
引用 楼主 vvqboy 的回复:
JAVA程序怎样快速访问oracle数据库的一张大表 目前我需要读取oracle中的一张表(关键字:只读,一张表)。 但这张表里有3.5亿条数据。 读取后,需要对每一条数据做处理(可以理解为插入到一张链表里)。 内存够大,就是速度太慢。 整张表处理完毕,需要大概24小时的时间。 希望大家能帮忙共享下经验,在这种情况下,怎么写java代码,能把数据快速处理。 我目前用的是从网上随便找的,一个典型的jdbc读取oracle数据库的代码,单线程。
首先你要分析清楚你目前问题的原因是什么 是插入的慢,读取的慢,还是分析的慢。 第二步,才是确认大致的方案,如果是插入的慢,估计多线程也不会快,那你就要想办法先解决插入速度的问题。
猿人林克 2014-11-18
  • 打赏
  • 举报
回复
引用 6 楼 l359122505 的回复:
1.将所有数据分段 2.多线程读取
你错了, 1.将所有数据分段 2.单线程读取 3.多线程处理
多木多多木 2014-11-18
  • 打赏
  • 举报
回复
这个是你自己的设计吗?如果涉及到3.5亿数据,最好使用MPP数据库或者hadoop平台,在分布式的环境下实现数据的检索。单纯的拼写sql语句可能效率很低。
yktd26 2014-11-13
  • 打赏
  • 举报
回复
分页读取,比如可以开多个线程,每个线程读取100万行
繁华终归落尽 2014-11-12
  • 打赏
  • 举报
回复
1.将所有数据分段 2.多线程读取
chaobin05240108 2014-11-12
  • 打赏
  • 举报
回复
select * from (select t.* rownum row_num from table1 t) where row_num between xx and xx 开100个线程,每个线程读取350万,免得出错不好恢复,一个线程错了,只需重新读取350万的数据
-天宇 2014-11-12
  • 打赏
  • 举报
回复
大数据处理思想:分而治之
捏造的信仰 2014-11-10
  • 打赏
  • 举报
回复
你不可能一个 select 全部读出来然后处理,因为一方面这个 cursor 长期占用整个表,对该表的其他事务处理会受到影响,另一方面一旦处理中途出错,你只能从头再来。如果处理到 3 亿条数据的时候出错,你想想恢复到这个位置要花多长时间。 所以最好的办法是通过排序和索引,一次取部分数据。排序的依据字段应该是不会变更的,比如记录创建时间,这样你就可以分步查询: select * from T where CREATE_TIME between [date1] and [date2]; 记下 date2,下次查询时参数变成 date2 和 date3(date1,date2 和 date3 都是递增的),以此类推。
luwenke 2014-11-10
  • 打赏
  • 举报
回复
把数据读入内存后,用多线程去处理数据。
cjh_tostring 2014-11-07
  • 打赏
  • 举报
回复
引用 1 楼 xiaopeipei2004 的回复:
单线程读取结果集,多线程处理结果集
是这样的,用单线程去读取数据,再创建一个线程池来处理数据。
grapepaul 2014-11-06
  • 打赏
  • 举报
回复
单线程读取结果集,多线程处理结果集

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧