2012-05-10 82 views
0

我需要使用Java程序将大量数据(近1000万条记录)从一个数据库(oracle)传输到另一个数据库(postgres)。我通过创建与两个DB的连接并查询源数据库中的数据,然后通过迭代结果集将数据插入到目标数据库中来完成相同的操作。但是传输数据需要很长时间。有什么办法可以快速完成传输过程吗?传输使用Java的巨大数据

+0

您可以使用Spring Batch框架并将文件拆分为块和进程。 – Seshagiri

+0

你正面临与这个人相同的问题>>> http://www.coderanch.com/t/470765/JDBC/java/Transfer-Huge-data-Java –

+0

为什么你必须使用Java? Oracle支持导出到文件,并且Postgres支持从文件导入。 Java不会是我的第一选择。 – EJP

回答

0

这里的问题是编程语言使用游标来处理元组集合,游标只能遍历他们,你不能做批量加载或类似的东西,这是真的,我认为每种编程语言,一个更快的解决方案将连接不知怎的,Oracle到PostgreSQL,我不知道该怎么做,但我认为它应该是可能的。有一切Oracle的功能。

1

另一种方法是将表中的所有数据导出到文本文件中,然后直接将该数据导入到postgres中。我不记得oracle有哪些导出功能,但最糟糕的情况是,您总是可以使用像这样的查询,将表中的内容作为一组插入语句来倾销:

select'insert into mynewtable values('| | old.a ||,'|| old.b || ...等等||');'从古老的古老的;

我已经在几个小时的时间内(每条记录之间有很多处理)在Oracle数据库(使用Java)中确定处理了10MM条记录。你希望得到什么样的表现?你现在得到了什么?

当您插入到postgres表中时,是否有很多索引或约束被检查?你的代码可能还有其他问题吗?如果你知道所有的行都是有效的,也许你应该在插入时删除postgres数据库中的约束?或者,如果你还没有一段时间,也许你需要抽空数据库?

+0

现在,我只是从oracle中读取很多记录,使用已经从postgres中选择的一些where子句,并再次插入所有选中到postgres中的记录。这需要花费数小时。 – satheesh

1

如果你仅限于单线程读取数据,写入数据,没有太多的改进空间。

这种类型的性能受到几种不同的事情的限制,即通过线路传输的数据量,网络速度,数据库索引和配置以及网络/主机中的其他内容。

至少应该使用更大的提取大小来设置读取连接。

ResultSet rs; 
... 
rs.setFetchSize(500); 

在插入的一面,你也应该看看配料使用一个CallableStatement

CallableStatement cs; 
Connection conn; 
conn.setAutoCommit(false); 
... 
cs.addBatch(); 

if (rowCount % batchsize == 0) { 
    int[] updateCounts = cs.executeBatch(); 

    conn.commit(); 
    batchCount = 0; 

    for (int i = 0; i < updateCounts.length; i++) { 
     if (updateCounts[i] < 1) 
      bad.write(batchRec[i]); 
    } 
} 

还有其他的东西,你可以在Oracle中的插入性能做,其中之一是建立一个批量加载使用命名管道,那么你的进程可以写入该命名管道。它们是未记录的操作,因此速度非常快。我没有从Java那里完成命名的管道事务,所以这是需要研究的东西,但是这应该会让你走。

你需要弄清楚你的瓶颈在哪里。由于查询是在某个表上进行表扫描,因此我发现性能会随着时间的推移而减少,并且检索后面的行的数据所需的时间会比先前的行长。与其他任何东西一样,您需要开始引入计时,以查看您的选择开始是否需要更多时间,或者读取性能是否相当稳定(如果后面的行读取时间比先前的读取时间要早行取)。最后,如果您可以整齐划分查询,则可以使用多个工作线程并行处理数据。

即。而不是

select a,b,c from source table 

你会打破它像

select a,b,c from source table where a < 10; 
select a,b,c from source_table where a >= 10 and a < 50; 
select a,b,c from source_table where a >= 50; 

其他任何事情一样,有一百的方式来做事。