在我的项目中,我们正在开发一个将数据从 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/