我需要使用Java程序将大量数据(近1000万条记录)从一个数据库(oracle)传输到另一个数据库(postgres)。我通过创建与两个DB的连接并查询源数据库中的数据,然后通过迭代结果集将数据插入到目标数据库中来完成相同的操作。但是传输数据需要很长时间。有什么办法可以快速完成传输过程吗?传输使用Java的巨大数据
回答
这里的问题是编程语言使用游标来处理元组集合,游标只能遍历他们,你不能做批量加载或类似的东西,这是真的,我认为每种编程语言,一个更快的解决方案将连接不知怎的,Oracle到PostgreSQL,我不知道该怎么做,但我认为它应该是可能的。有一切Oracle的功能。
另一种方法是将表中的所有数据导出到文本文件中,然后直接将该数据导入到postgres中。我不记得oracle有哪些导出功能,但最糟糕的情况是,您总是可以使用像这样的查询,将表中的内容作为一组插入语句来倾销:
select'insert into mynewtable values('| | old.a ||,'|| old.b || ...等等||');'从古老的古老的;
我已经在几个小时的时间内(每条记录之间有很多处理)在Oracle数据库(使用Java)中确定处理了10MM条记录。你希望得到什么样的表现?你现在得到了什么?
当您插入到postgres表中时,是否有很多索引或约束被检查?你的代码可能还有其他问题吗?如果你知道所有的行都是有效的,也许你应该在插入时删除postgres数据库中的约束?或者,如果你还没有一段时间,也许你需要抽空数据库?
现在,我只是从oracle中读取很多记录,使用已经从postgres中选择的一些where子句,并再次插入所有选中到postgres中的记录。这需要花费数小时。 – satheesh
如果你仅限于单线程读取数据,写入数据,没有太多的改进空间。
这种类型的性能受到几种不同的事情的限制,即通过线路传输的数据量,网络速度,数据库索引和配置以及网络/主机中的其他内容。
至少应该使用更大的提取大小来设置读取连接。
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;
其他任何事情一样,有一百的方式来做事。
- 1. 流每秒巨大的数据用java
- 2. 从文件到数据库使用java的巨大数据?
- 3. OneDrive巨大的数据流上传
- 4. 巨大的数据输入webform性能
- 5. Java巨大的数据存储
- 6. Java - 巨大的数据检索
- 7. Java网络传输大量数据
- 8. 使用java套接字传输大量数据
- 9. 使用流在Java中传输数据
- 10. 当使用Java/OJDBC时性能巨大
- 11. 启用一个巨大的数据帧
- 12. 如何在PowerShell中使用XmlReader来传输大/巨大的XML文件?
- 13. 使用arraylist处理巨大的数据大小
- 14. 使用密钥存储无限大小的巨大json数据
- 15. 写一个巨大的数据2D数组,以Excel文件使用Java POI
- 16. 巨大的文件上传
- 17. signalR和大数据传输
- 18. FireBug数据传输大小
- 19. 管道传输大数据
- 20. 处理巨大的数字C,Java,Informix
- 21. java读取巨大csv的行数
- 22. Java StringBuilder巨大的开销
- 23. java中的巨大矩阵
- 24. Java Json数据传输
- 25. java swing jlist数据传输
- 26. 巨大的GIS数据需要使用传单在地图上显示
- 27. 使用NDIS传输数据
- 28. 使用HttpURLConnection传输数据
- 29. 使用DTO传输数据
- 30. 使用CoreBluetooth传输数据
您可以使用Spring Batch框架并将文件拆分为块和进程。 – Seshagiri
你正面临与这个人相同的问题>>> http://www.coderanch.com/t/470765/JDBC/java/Transfer-Huge-data-Java –
为什么你必须使用Java? Oracle支持导出到文件,并且Postgres支持从文件导入。 Java不会是我的第一选择。 – EJP