gpt4 book ai didi

java - Oracle 到 Postgres 数据传输

转载 作者:行者123 更新时间:2023-11-29 11:55:57 28 4
gpt4 key购买 nike

几年前,我编写了一个小实用程序,用于将数据从 Oracle 数据库移动到 Postgres 数据库。我使用 Java 和 JDBC 来完成此任务,因为我希望 Java 处理准备好的语句中使用的数据的数据格式以执行插入。该实用程序的原始版本假设两个数据库中的表名和列名相同。更高版本接受映射文件来处理名称差异。这个实用程序在我的组织中大受欢迎,但不幸的是,它没有扩展。它每小时最多移动约一百万行。我们现在的表有 30 多万行,没有人愿意等待 30 个小时来传输数据。

下面的方法是该实用程序的核心,也是它无法扩展的原因。该方法对每列数据执行一次,因此它被调用(num_rows*num_cols 次)。通过分析器,我发现该方法消耗了 58% 的执行时间。仅 getObject() 和 findColumn() 调用就占了执行时间的 53%!

    public void setPlaceholderValue ( int placeHolderNum, ResultSet rs, String oracleColumnName, PreparedStatement stmt ) throws Exception {

int columnIndex = rs.findColumn(oracleColumnName) ;
int columnType = rs.getMetaData().getColumnType(columnIndex) ;

try{
if ( rs.getObject(oracleColumnName) != null ){
switch (columnType) {
case Types.VARCHAR: stmt.setString(placeHolderNum, rs.getString(columnIndex)); break;
case Types.INTEGER: stmt.setInt(placeHolderNum, rs.getInt(columnIndex)); break ;
case Types.DATE: stmt.setDate(placeHolderNum, rs.getDate(columnIndex)); break;
case Types.FLOAT: stmt.setFloat(placeHolderNum, rs.getFloat(columnIndex)); break ;
case Types.NUMERIC: stmt.setBigDecimal(placeHolderNum,rs.getBigDecimal(columnIndex)); break ;
case Types.TIMESTAMP: stmt.setTimestamp(placeHolderNum, rs.getTimestamp(columnIndex)); break ;
default: throw new SQLException("The result set column type " + rs.getMetaData().getColumnType(columnIndex) + " was not recognized. see the java.sql.Types class at http://java.sun.com/j2se/1.5.0/docs/api/ ");
}
} else {
stmt.setNull(placeHolderNum, columnType);
}
} catch (SQLException e){
System.out.println ("SQLException: " + e.getMessage() + " for record id=" + rs.getLong("id"));
throw new SQLException("rethrow");
}
}

我不确定我是否可以重构此方法以充分缩短传输时间。我认为逐栏方法根本无法扩展。

有人可以建议更好的方法吗?语言不是问题,我可以用任何能处理问题的东西来做到这一点工作。理想情况下,我希望看到每小时至少 1000 万条记录的传输率。

最佳答案

我建议使用数据库提供的导出/导入工具。 Oracle 和 PostgreSQL 支持 XML 和 CSV 格式。

如果您想坚持使用 JDBC,请将列放置在 ResultSetSELECT 查询中,其顺序与 中的值相同INSERT PreparedStatement 查询,只需执行以下操作,而不是执行整个 if/switch block :

preparedStatement.setObject(index, resultSet.getObject(index));

但是,我并不期望这会极大地提高性能。 DB 提供的导出/导入功能比 Java 中的导出/导入功能更加高效。

关于java - Oracle 到 Postgres 数据传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3781323/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com