利用jdbc解决跨数据库之间数据迁移(oracle迁移db2)

二次开发的项目,基本都会牵扯到数据的迁移,记录一下不适用框架利用原生jdbc来访问数据库进行数据的迁移操作.

第一个 数据库(例bd2):

public class ConnectionDB2 {
	private static final String URL="jdbc:db2://ip地址:端口/名字"; //DB2数据库url
	private static final String USER="***";	//DB2数据库账号
	private static final String PASSWORD="***"; //DB2数据库密码
	
	static{
	try {
	Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance(); //利用反射注册驱动
	} catch (InstantiationException e) {
	e.printStackTrace();
	} catch (IllegalAccessException e) {
	e.printStackTrace();
	} catch (ClassNotFoundException e) {
	e.printStackTrace();
	}
	}

	public Connection getConnection(){
	Connection conn=null;
	try {
	conn=DriverManager.getConnection(URL, USER, PASSWORD);
	} catch (SQLException e) {
	e.printStackTrace();
	}
	return conn;
	}
}

第二个 数据库(例oracle)

public class ConnectionORACLE {
	private static final String URL="jdbc:oracle:thin:@ip:端口:nbcsora"; //ORACLE数据库url
	private static final String USER="***";	//ORACLE数据库账号
	private static final String PASSWORD="***"; //ORACLE数据库密码
	
	static{
	try {
	Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //利用反射注册驱动
	} catch (InstantiationException e) {
	e.printStackTrace();
	} catch (IllegalAccessException e) {
	e.printStackTrace();
	} catch (ClassNotFoundException e) {
	e.printStackTrace();
	}
	}

	public Connection getConnection(){
	Connection conn=null;
	try {
	conn=DriverManager.getConnection(URL, USER, PASSWORD);
	} catch (SQLException e) {
	e.printStackTrace();
	}
	return conn;
	}
}

下面就是公共的连接关闭资源方法:

public class CloseFunction {
	//关闭连接方法,释放资源
	public static void closeConnection(Connection conn){
	if (conn !=null){ 
	try {
	conn.close();
	} catch (SQLException e) {
	e.printStackTrace();
	}
	}
	}

	//关闭执行sql,释放资源
	public static void closeExecuteSQL(Statement preparedStatement){
	if (preparedStatement !=null){
	try {
	preparedStatement.close();
	} catch (SQLException e) {
	e.printStackTrace();
	}
	}
	}

	//关闭查询SQL结果,释放资源
	public static void closeResultSet(ResultSet resultSet){
	if(resultSet !=null){
	try {
	resultSet.close();
	} catch (SQLException e) {
	e.printStackTrace();
	}
	}
	}
}
上面搞定,那就可以写jdbc原生代码进行对数据库的转移了:

public void test(){
		
		long startTime=System.currentTimeMillis(); //记录开始时间
		Connection connDB2=null; //链接DB2数据库
		Connection connOracle=null; //链接oracle数据库
		Statement statement=null; 
		ResultSet resultSet=null;
		Statement statementOR=null; 
		ResultSet resultSetOR=null; //oracle 结果集
		PreparedStatement preparedStatement=null; 
		
		try {
			ConnectionORACLE connectionOracle=new ConnectionORACLE();
			System.out.println(connectionOracle+"链接oracle成功!");
		ConnectionDB2 connectionDB2=new ConnectionDB2();
		
		System.out.println(connectionDB2+"-->>>链接DB2数据库成功!");
		
		connOracle=connectionOracle.getConnection();
		//oracle语句
		String oracleSQLT="SELECT transmsn_dt_tm_conv, acq_ins_id_cd_conv,sys_tra_no_conv,frn_ins_tp,msg_tp_conv,transmsn_dt_tm,acq_ins_id_cd,sys_tra_no,related_key,alt_key," +
				"fwd_ins_tp,acq_ins_tp,rcv_ins_tp,iss_ins_tp,rsn_cd,rsn_cd_conv,trans_rcv_ts,to_ts,moni_dist,moni_in," +
				"risk_in,pre_proc_st,frn_bat_no,trans_id,trans_id_conv,trans_seq,trans_seq_conv,trans_tp,trans_tp_conv,resnd_num," +
				"settle_dt,settle_mon,settle_d,cycle_no,sms_dms_conv_in,msg_tp,pri_acct_no,pri_acct_no_conv,bin,cups_card_in," +
				"cups_sig_card_in,card_brand,card_class,card_attr,trans_chnl,card_media,proc_cd,proc_cd_conv,trans_at,fwd_settle_at," +
				"rcv_settle_at,fwd_settle_conv_rt,rcv_settle_conv_rt,fee_dir_in,dms_trans_id,iss_ins_id_cd,loc_trans_tm,loc_trans_tm_conv,loc_trans_dt,mchnt_tp," +
				"mchnt_tp_conv,acq_ins_cntry_cd,pos_entry_md_cd,pos_entry_md_cd_conv,card_seq_id,pos_cond_cd,pos_cond_cd_conv,pos_pin_capture_cd,fwd_ins_id_cd,fwd_ins_id_cd_conv," +
				"retri_ref_no,retri_ref_no_conv,term_id,term_id_conv,mchnt_cd,mchnt_cd_conv,card_accptr_nm_loc,card_accptr_nm_loc_conv,sec_related_ctrl_inf,addn_pos_inf," +
				"addn_pos_inf_conv,orig_msg_tp,orig_msg_tp_conv,orig_sys_tra_no,orig_sys_tra_no_conv,orig_transmsn_dt_tm,orig_transmsn_dt_tm_conv,orig_acq_ins_id_cd,orig_acq_ins_id_cd_conv,orig_fwd_ins_id_cd," +
				"orig_fwd_ins_id_cd_conv,rcv_ins_id_cd,rcv_ins_id_cd_conv,auth_resp,session_id,cgw_svc_name,file_upd_cd,svc_retr_cd,visa_private,fwd_ins_cntry_cd," +
				"frn_trans_fee_at,frn_trans_proc_fee_at,trans_fee_at,fwd_proc_in,rcv_proc_in,trans_st,trans_fin_ts,frn_settle_dt,trans_curr_cd,fwd_settle_curr_cd," +
				"rcv_settle_curr_cd,cdhd_at,cdhd_conv_rt,cdhd_curr_cd,expire_dt,conv_dt,ext_pan_cntry_cd,auth_id_resp_cd,iss_resp_cd,iss_resp_cd_conv," +
				"acq_resp_cd,acq_resp_cd_conv,repl_at,func_cd,orig_data,orig_at,resv_fld1,resv_fld2,addn_pvt_dat,addn_at," +
				"iss_addn_dat,iss_ins_res,swt_dat,fina_net_dat,fina_net_id,cups_def_fld,cups_def_fld_conv,internal_header,ext_header,visa_header," +
				"track_1_dat,track_2_dat,track_3_dat,id_no,tfr_in_acct_id,tfr_out_acct_id,cups_res,cups_res_conv,acq_ins_res,pri_acct_no_ext," +
				"ic_flds,resv_fld3,resv_fld4,resv_fld5,resv_fld6,cdhd_auth_info,cdhd_auth_rslt from TBL_SWT_FRN_TRANS_LOG1  ";//373 400
		
		//执行db2数据库sql语句
		String SQL="INSERT INTO FPDB_SWT.TBL_SWT_FRN_TRANS_LOG3(transmsn_dt_tm_conv, acq_ins_id_cd_conv,sys_tra_no_conv,frn_ins_tp,msg_tp_conv,transmsn_dt_tm,acq_ins_id_cd,sys_tra_no,related_key,alt_key," +
				"fwd_ins_tp,acq_ins_tp,rcv_ins_tp,iss_ins_tp,rsn_cd,rsn_cd_conv,trans_rcv_ts,to_ts,moni_dist,moni_in," +
				"risk_in,pre_proc_st,frn_bat_no,trans_id,trans_id_conv,trans_seq,trans_seq_conv,trans_tp,trans_tp_conv,resnd_num," +
				"settle_dt,settle_mon,settle_d,cycle_no,sms_dms_conv_in,msg_tp,pri_acct_no,pri_acct_no_conv,bin,cups_card_in," +
				"cups_sig_card_in,card_brand,card_class,card_attr,trans_chnl,card_media,proc_cd,proc_cd_conv,trans_at,fwd_settle_at," +
				"rcv_settle_at,fwd_settle_conv_rt,rcv_settle_conv_rt,fee_dir_in,dms_trans_id,iss_ins_id_cd,loc_trans_tm,loc_trans_tm_conv,loc_trans_dt,mchnt_tp," +
				"mchnt_tp_conv,acq_ins_cntry_cd,pos_entry_md_cd,pos_entry_md_cd_conv,card_seq_id,pos_cond_cd,pos_cond_cd_conv,pos_pin_capture_cd,fwd_ins_id_cd,fwd_ins_id_cd_conv," +
				"retri_ref_no,retri_ref_no_conv,term_id,term_id_conv,mchnt_cd,mchnt_cd_conv,card_accptr_nm_loc,card_accptr_nm_loc_conv,sec_related_ctrl_inf,addn_pos_inf," +
				"addn_pos_inf_conv,orig_msg_tp,orig_msg_tp_conv,orig_sys_tra_no,orig_sys_tra_no_conv,orig_transmsn_dt_tm,orig_transmsn_dt_tm_conv,orig_acq_ins_id_cd,orig_acq_ins_id_cd_conv,orig_fwd_ins_id_cd," +
				"orig_fwd_ins_id_cd_conv,rcv_ins_id_cd,rcv_ins_id_cd_conv,auth_resp,session_id,cgw_svc_name,file_upd_cd,svc_retr_cd,visa_private,fwd_ins_cntry_cd," +
				"frn_trans_fee_at,frn_trans_proc_fee_at,trans_fee_at,fwd_proc_in,rcv_proc_in,trans_st,trans_fin_ts,frn_settle_dt,trans_curr_cd,fwd_settle_curr_cd," +
				"rcv_settle_curr_cd,cdhd_at,cdhd_conv_rt,cdhd_curr_cd,expire_dt,conv_dt,ext_pan_cntry_cd,auth_id_resp_cd,iss_resp_cd,iss_resp_cd_conv," +
				"acq_resp_cd,acq_resp_cd_conv,repl_at,func_cd,orig_data,orig_at,resv_fld1,resv_fld2,addn_pvt_dat,addn_at," +
				"iss_addn_dat,iss_ins_res,swt_dat,fina_net_dat,fina_net_id,cups_def_fld,cups_def_fld_conv,internal_header,ext_header,visa_header," +
				"track_1_dat,track_2_dat,track_3_dat,id_no,tfr_in_acct_id,tfr_out_acct_id,cups_res,cups_res_conv,acq_ins_res,pri_acct_no_ext," +
				"ic_flds,resv_fld3,resv_fld4,resv_fld5,resv_fld6,cdhd_auth_info,CDHD_AUTH_RSLT)"+ "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
			
		statementOR=connOracle.createStatement();
		statementOR.execute(oracleSQLT);//执行sql
		resultSetOR=statementOR.getResultSet();//获取oracle结果集;
		connDB2=connectionDB2.getConnection();//db2链接
		statement=connDB2.createStatement();
		connDB2.setAutoCommit(false);
		preparedStatement=connDB2.prepareStatement(SQL);//预编译
		
		int num=0;
		while (resultSetOR.next()) {
			num ++;
			preparedStatement.setString(1, LangUtils.returnString(resultSetOR.getString("transmsn_dt_tm_conv")));
			....
			//preparedStatement.executeUpdate();
			
			preparedStatement.addBatch();
			//每一万次在oracle数据库里提交事务
			if(num>10000){
			preparedStatement.executeBatch();
			connDB2.commit();
			num=0;
			}
			}
			preparedStatement.executeBatch();
			connDB2.commit();
			
		} catch (Exception e) {
			try {
				connDB2.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}finally{
			new CloseFunction().closeConnection(connOracle); //关闭oracle数据库,释放资源
			new CloseFunction().closeConnection(connDB2); //关闭DB2数据库,释放资源
			long endTime=System.currentTimeMillis(); //记录程序结束时间
			System.out.println("总的时间:"+(endTime-startTime)/1000+"秒");
		}
	}




猜你喜欢

转载自blog.csdn.net/superpojo/article/details/78749113