在我的项目中,我们正在开发一种将数据从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中逐行插入。
有人可以帮助我找到更好的方法吗?
答案 0 :(得分:1)
许多现有工具都是从ORACLE迁移DDL(结构)和DATA到DB2的理想选择。 来自IBM的一个示例是IBM® Database Conversion Workbench (DCW),它可以成功支持所有迁移阶段。
如果您需要构建自己的内容(例如执行培训任务),则仍然有很多选择: -DB2允许使用DB2 WRAPPER通过ODBC直接映射ORACLE表;那么您只是发布经典的INSERT SELECT语句 -在表级别,两个DBMS都具有导出/导入功能(ORACLE exp实用程序; DB2 LOAD命令) -在行级别,两个DBMS都通过SQL api具有批量功能
答案 1 :(得分:0)
您可以从Db2 LUW联合到Oracle数据源。本页列出了所有受支持的Db2 11.1 http://www-01.ibm.com/support/docview.wss?uid=swg27049211来源的联合身份验证
对于Oracle,您可以通过IBM品牌的ODBC驱动程序包或Oracle NET客户端12进行连接。如果您使用后者,则需要将其安装在Db2服务器上。在x86_64 Linux和AIX上,从V11.1修订包1(V11.1.1.1)开始,Db2 LUW中包含IBM品牌的ODBC驱动程序软件包。
一旦您将联合身份验证配置为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的高级版和开发版中包含与非IBM数据服务器(例如Oracle和其他)的联合身份验证。 https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.licensing.doc/doc/r0053238.html
答案 2 :(得分:0)
您可以采用多种方法来优化Db2中的插入性能。如您建议的那样,逐行插入不是最佳选择。
史蒂夫·里斯(Steve Rees)的这篇文章很好地介绍了这些选项https://www.idug.org/p/bl/et/blogid=2&blogaid=602
请注意,另一种选择是使用EXTERNAL TABLE
。 https://www.ibm.com/support/knowledgecenter/en/SS6NHC/com.ibm.swg.im.dashdb.sql.ref.doc/doc/r_create_ext_table.html
但是,在撰写本文时,只有Db2 Warehouse支持这些功能