java - 从 Oracle 到 DB2 数据库的数据传输

标签 java oracle db2

在我的项目中,我们正在开发一个将数据从 Oracle 传输到 DB2 数据库的工具。我的方法是从 Oracle 中逐表获取数据,然后将其插入 DB2 中的表中。我的实现是 -

package com.rolta.ntps.service;

import java.sql.ResultSet;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import com.rolta.ntpc.Util.JdbcDB2Connection;
import com.rolta.ntpc.Util.JdbcOracleConnection;

public class PRJCT_TYPE_MST {
    static Logger logger = Logger.getLogger(BOI_ITEM_DTL.class);

    public void getAndInsertData(String tableName) {
        logger.info("**************Fetching Data From Table "+tableName+"*************");

        try {
            JdbcOracleConnection oracleStem = new JdbcOracleConnection(); 
            Statement oracleSmt = oracleStem.oracleStatement();

            ArrayList<Integer> prjct_type_key = new ArrayList<Integer>();
            ArrayList<Integer> prjct_drtn = new ArrayList<Integer>();

            ArrayList<String> prjct_type_code = new ArrayList<String>();
            ArrayList<String> prjct_type_desc = new ArrayList<String>();
            ArrayList<String> crt_by = new ArrayList<String>();
            ArrayList<String> upd_by = new ArrayList<String>();

            ArrayList<String> audit_crt_date = new ArrayList<String>();
            ArrayList<String> audit_upd_date = new ArrayList<String>();

            String query = "select * from NTPC2." + tableName;
            System.out.println("Query is : " + query);
            logger.info("Oracle Query is : " + query);

            ResultSet oracleRS = oracleSmt.executeQuery(query);
            int rowCountInOracle = 0;

            System.out.println("*************Data From Oracle Table************");

            while(oracleRS.next()) {

                prjct_type_key.add(oracleRS.getInt("PRJCT_TYPE_KEY"));
                prjct_drtn.add(oracleRS.getInt("PRJCT_DRTN"));

                prjct_type_code.add(oracleRS.getString("PRJCT_TYPE_CODE"));
                prjct_type_desc.add(oracleRS.getString("PRJCT_TYPE_DESC"));
                crt_by.add(oracleRS.getString("CRT_BY"));
                upd_by.add(oracleRS.getString("UPD_BY"));

                audit_crt_date.add(oracleRS.getString("AUDIT_CRT_DATE"));
                audit_upd_date.add(oracleRS.getString("AUDIT_UPD_DATE"));

                ++rowCountInOracle;
            }

            System.out.println("Row count is : "+ rowCountInOracle);
            logger.info("Row count is : "+ rowCountInOracle);


            logger.info("Inserting Data To DB2");
            JdbcDB2Connection db2Object = new JdbcDB2Connection();
            Statement db2Smt = db2Object.dB2Statement();
            String db2Query = "SELECT * from DRAWING."+tableName;
            ResultSet db2RS = db2Smt.executeQuery(db2Query);

            for(int i = 0; i < rowCountInOracle; i++) {
                db2RS.moveToInsertRow();

                db2RS.updateInt("PRJCT_TYPE_KEY", prjct_type_key.get(i));
                db2RS.updateInt("PRJCT_DRTN", prjct_drtn.get(i));

                db2RS.updateString("PRJCT_TYPE_CODE", prjct_type_code.get(i));
                db2RS.updateString("PRJCT_TYPE_DESC", prjct_type_desc.get(i));
                db2RS.updateString("CRT_BY", crt_by.get(i));
                db2RS.updateString("UPD_BY", upd_by.get(i));

                if(audit_crt_date.get(i) != null) {
                    db2RS.updateDate("AUDIT_CRT_DATE", stringToDate(audit_crt_date.get(i)));
                } else {
                    System.out.println("audit_crt_date date is null");
                    logger.info("audit_crt_date date is null");
                }

                if(audit_upd_date.get(i) != null) {
                    db2RS.updateDate("AUDIT_UPD_DATE", stringToDate(audit_upd_date.get(i)));
                } else {
                    System.out.println("audit_upd_date date is null");
                    logger.info("audit_upd_date date is null");
                }


            }


        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }

    public static java.sql.Date stringToDate(String date) {
        logger.info("Accepted Date Format is - MM-DD-YYYY");

        logger.info("Converting String : "+ date +" into Date Format");

        SimpleDateFormat sdf = new SimpleDateFormat("MM/DD/YYYY");
        java.util.Date utilDate;
        java.sql.Date sqlDate = null;
        try {
            utilDate = sdf.parse(date);
            sqlDate = new java.sql.Date(utilDate.getTime());
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        logger.info("Date is : "+ sqlDate);

        return sqlDate;

    }

}

这种方法有效,但我对性能不满意。我明白,这不是性能优化代码,因为我正在从 Oracle 的表中逐行读取并在 DB2 中逐行插入。

有人可以帮我找到更好的方法吗?

最佳答案

许多现有工具都可以很好地将 DDL(结构)和数据从 ORACLE 迁移到 DB2。 IBM 的一个示例是 IBM® Database Conversion Workbench (DCW)这可以成功支持所有迁移阶段。

如果您需要构建自己的(例如训练任务),您仍然有很多选择: -DB2 允许使用 DB2 WRAPPER 通过 ODBC 直接映射 ORACLE 表;那么您只需发出经典的 INSERT SELECT 语句 -在表级别,两个 DBMS 都具有导出/导入功能(ORACLE exp 实用程序;DB2 LOAD 命令) -在行级别,两个 DBMS 都通过 SQL API 具有批量功能

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

相关文章:

java - ImageView MotionEvent如果有两个指针,则停止ACTION_UP

sql - 选择单行的多列作为数组元素

这里不允许使用 oracle 列

java - DB2 中是否有类似 "Database Change Notification"的内容

java - Java Scanner 中的非捕获组被忽略

java - GWT 应用程序不会从 Eclipse 中终止

java - Camel 路线上的复杂情况

SQL: DISTINCT 不适用于游标

Python DB2 - 找不到符号

sql - 在 db2 中使用多个内部联接进行更新