繁体   English   中英

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

[英]Data Transfer From Oracle to DB2 Database

在我的项目中,我们正在开发一种将数据从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(结构)和DATA从ORACLE迁移到DB2的理想选择。 IBM的一个示例是IBM®数据库转换工作台(DCW) ,它可以成功地支持所有迁移阶段。

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

您可以从Db2 LUW联合到Oracle数据源。 此页面列出了所有受支持的Db2 11.1来源的联合身份验证http://www-01.ibm.com/support/docview.wss?uid=swg27049211

对于Oracle,您可以通过IBM品牌的ODBC驱动程序包或Oracle NET客户端12进行连接。 如果您使用后者,则需要将其安装在Db2服务器上。 Db2 LUW中包含IBM品牌的ODBC驱动程序软件包,从x86_64 Linux和AIX上的V11.1修订包1(V11.1.1.1)开始。

在将联合身份验证配置到Oracle服务器之后(例如,使用http://www-01.ibm.com/support/docview.wss?uid=swg21996919上 11.1.1.1的“无DSN”连接说明),您可以只需INSERT INTO target_db2_table SELECT * FROM source_oracle_nickname

请注意,仅在Db2的Advanced和Developer Edition中包括与非IBM数据服务器(例如Oracle和其他)的联合。 https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.licensing.doc/doc/r0053238.html

您可以采用多种方法来优化Db2中的插入性能。 如您所建议,逐行插入不是最佳选择。

史蒂夫·里斯(Steve Rees)的这篇文章很好地介绍了这些选项, https://www.idug.org/p/bl/et/blogid=2&blogaid=602

注意,另一个选择是使用EXTERNAL TABLE https://www.ibm.com/support/knowledgecenter/zh-CN/SS6NHC/com.ibm.swg.im.dashdb.sql.ref.doc/doc/r_create_ext_table.html但是这些仅在Db2 Warehouse上受支持写作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM