Передача данных из Oracle в базу данных DB2 - PullRequest
0 голосов
/ 28 сентября 2018

В моем проекте мы разрабатываем инструмент для передачи данных из 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.

Может ли кто-нибудь помочь мне найти лучший подход?

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Вы можете интегрировать данные из Db2 LUW в источники данных Oracle.На этой странице перечислены все поддерживаемые источники федерации для Db2 11.1 http://www -01.ibm.com / support / docview.wss? Uid = swg27049211

Для Oracle вы можете подключиться через IBMФирменный пакет драйвера ODBC или клиент Oracle NET12.Если вы используете последний, он должен быть установлен на сервере Db2.Пакет драйвера ODBC под брендом IBM включен в Db2 LUW, начиная с пакета исправлений 1 (V11.1.1.1) V11.1 для x86_64 Linux и AIX.

После настройки федерации на сервере Oracle - (например, используйтеинструкции по подключению "без DSN" для 11.1.1.1 здесь http://www -01.ibm.com / support / docview.wss? uid = swg21996919 ) вы можете просто INSERT INTO target_db2_table SELECT * FROM source_oracle_nickname.

Обратите внимание, что Федерация с серверами данных сторонних производителей (например, Oracle и другими) включена только в выпуски Advanced и Developer Edition Db2.https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.licensing.doc/doc/r0053238.html

0 голосов
/ 28 сентября 2018

Существует ряд возможностей для оптимизации производительности вставки в Db2.Как вы предлагаете, вставка строка за строкой не оптимальна.

Эта статья Стива Риса очень хорошо описывает параметры https://www.idug.org/p/bl/et/blogid=2&blogaid=602

Обратите внимание, что другой вариант будет использовать EXTERNAL TABLE s.https://www.ibm.com/support/knowledgecenter/en/SS6NHC/com.ibm.swg.im.dashdb.sql.ref.doc/doc/r_create_ext_table.html Однако они поддерживаются только в Db2 Warehouse на момент написания

0 голосов
/ 28 сентября 2018

Многие существующие инструменты могут быть хорошими кандидатами для переноса ваших DDL (структур) и DATA из ORACLE в DB2.Одним из примеров от IBM является IBM® Database Conversion Workbench (DCW) , который может успешно поддерживать все этапы миграции.

Если вам нужно создать свою собственную, например, для учебной задачи, у вас все еще есть много вариантов: -DB2 позволяет напрямую отображать таблицу ORACLE через ODBC с использованием DB2 WRAPPER;затем вы просто выполняете классические операторы INSERT SELECT. На уровне таблиц обе СУБД имеют возможности экспорта / импорта (утилита ORACLE exp; команда DB2 LOAD).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...