java 进程 同步_JAVA开发的一个同步程序

package com.palic.elis.tjs.ceis.dao;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import tjs.plugins.jdbc.DBOperateFactory;

import com.beetle.framework.log.SysLogger;

public class SyncVipToLcchCeisCustomerContactTmp {

SysLogger logger = SysLogger.getInstance("JobRunLog");

// 中心库

private static final String ELIS_DATA_SOURCE = "ELIS_DB";

private static final String VIP_DATA_SOURCE = "VIP_DB";

// JOB名字

private static final String PRAISE_JOB_NAME = "SyncVipToLcchCeisCustomerContactTmpJob";// TJS同步数据到CEIS临时表

private static final String SQL_SWITCH_QUERY = "SELECT TO_CHAR(CONTROL_DATE,'yyyy-mm-dd') LAST_SYNC,to_char(sysdate,'yyyy-mm-dd') TODAY, CONTROL_CHAR SWITCH_FLAG FROM ceis_control WHERE control_id = 'SyncVipToLcchCeisCustomerContactTmpJob'";

private static final String SQL_SWITCH_UPDATE = "UPDATE ceis_control SET CONTROL_DATE =SYSDATE WHERE control_id = 'SyncVipToLcchCeisCustomerContactTmpJob'";

// VIP系统同步数据到CEIS临时表查询语句

private static final String SQL_QUERY_Userdefined_LIST = "select  Contact_Type_Id,"

+ "Contact_Id,"

+ "Channel_Id,"

+ "Date_Start,"

+ "'02' motive_type,"

+ "SYSTEM_ID,"

+ "Motive_Result_Id,"

+ "Activity_Id,"

+ "Activity_Type,"

+ "Url_Content,"

+ "Match_Flag,"

+ "Mem_Name,"

+ "Sex,"

+ "to_char(Date_Birthday,'yyyy-mm-dd') Date_Birthday,"

+ "ID_Type,"

+ "ID_No," + "Row_id" + " from  " + " order_info_to_lcch_temp";

// 根据五项信息查询客户号信息

private static final String SQL_QUERY_UserClientno_LIST = "SELECT CLIENTNO FROM ecif_client_info WHERE id_type = decode(ltrim(rtrim(?)),'***','1','护照','2','军人证','3','少儿证','4','异常***','5','港澳台证件','6','户口本','0','转换不详','9','出生证','A','9')"

+ " AND ((id_type = '1' AND elis_ecif_package.func_is_idno_equal(idno,  ltrim(rtrim(?))) = 'Y') OR (id_type <> '1' AND upper(idno) = upper( ltrim(rtrim(?))))) "

+ " AND client_name =  ltrim(rtrim(?)) "

+ "AND trunc(birth_date, 'DD') = trunc(to_date(?,'yyyy-mm-dd'), 'DD') "

+ "AND sex = decode(ltrim(rtrim(?)),'男','M','女','F','9') and rownum=1 ";

// 插入到CEIS的CEIS_CUSTOMER_CONTACT_TMP表

private static final String SQL_INSERT_KIT_INFO_LIST = "insert into ceis_customer_contact_new_tmp (module_code,contact_type_id,contact_id,channel_id,date_start,client_no ,motive_type ,system_id ,motive_result_id,activity_id ,activity_type  ,url_content , match_flag) values(?,?,?,?,?,?,?,?,?,?,?,?,?)";

// 更新VIP系统同步标志

private static final String SQL_VIP_UPDATE = "update order_info_to_lcch_temp set is_synchronized=?, CREATED=SYSDATE, CREATED_BY=USER ,LAST_UPD=SYSDATE,  LAST_UPD_BY=USER ";

// 维护ceis_activity_table基表

private static final String SQL_Query_PROD_INFO_TO_LCCH_TEMP = "select trim(row_id) row_id, trim(a.prod_code)prod_code ,trim(a.prod_name)prod_name from PROD_INFO_TO_LCCH_TEMP a  where a.is_synchronized='01'";

// 查询基表是否有

private static final String SQL_Query_Ceis_Activity_Table_CNT = "select  count(*)cnt from ceis_activity_table a where a.activity_type=?";

// 插入基表

private static final String SQL_Insert_Ceis_Activity_Table = "insert into ceis_activity_table( activity_type,module_code,description) values(?,?,?)";

// 更新VIP产品表的同步标志

private static final String SQL_UPDATE_PROD_INFO_TO_LCCH_TEMP = "update  prod_info_to_lcch_temp a set a.is_synchronized=?,a.created=sysdate,a.created_by=user,a.last_upd=sysdate,a.last_upd_by=user";

// 记录日志

private static final String SQL_TJS_CEIS_TRACE_LOG = "insert into  ceis_trace(ctrlno,trace_info,trace_type)values('SyncVipToLcchCeisCustomerContactTmpJob',?,'-1')";

private static final String SQL_TJS_MONITOR_INS = "insert into elis_tjs_jobs_monitor(job_name,execute_date,source,target,source_count,target_count) values(?,sysdate,?,?,?,?)";

private final Connection connElis;

private final Connection connVip;

private final int commitCnt = 10;

public SyncVipToLcchCeisCustomerContactTmp() {

connElis = DBOperateFactory.getConncetion(ELIS_DATA_SOURCE);

connVip = DBOperateFactory.getConncetion(VIP_DATA_SOURCE);

}

// 获取开关

public Map getJobSwitch() {

try {

return queryForMap(connElis, SQL_SWITCH_QUERY);

} catch (Exception ex) {

logger.info("getJobSwitch ", ex);

}

return new HashMap();

}

// 更新开关日期

public final int updateJobSwitch() {

try {

return updateSql(connElis, SQL_SWITCH_UPDATE);

} catch (SQLException ex) {

logger.info("updateJobSwitch", ex);

}

return 0;

}

// 运行

@SuppressWarnings({ "rawtypes" })

public void run() {

try {

// 查询开关日期,防止重复同步

Map switchMap = getJobSwitch();

String last = (String) switchMap.get("LAST_SYNC");

String today = (String) switchMap.get("TODAY");

if (last == null || last.compareTo(today) < 0) {

// VIP同步数据到CEIS临时表语句

syncDepraiseData(last);

// 更新开关日期

updateJobSwitch();

}

} catch (Exception e) {

e.printStackTrace();

}

}

// VIP同步数据到CEIS临时表语句

public void syncDepraiseData(String day) throws SQLException {

int cnt = 0;

int count = 0;

StringBuffer st = new StringBuffer();

ResultSet rtype = null;

ResultSet qcnt = null;

String pcode = null;

String Rowid = null;

PreparedStatement quertype = null;

PreparedStatement querycnt = null;

PreparedStatement insertable = null;

PreparedStatement update = null;

List CommitProdList = new ArrayList();

// 维护基表

logger.info("------维护基表开始-----");

try {

// 查询VIP系统没有同步的业务类型

quertype = connVip

.prepareStatement(SQL_Query_PROD_INFO_TO_LCCH_TEMP);

// 查询基表是否已经存在

querycnt = connElis

.prepareStatement(SQL_Query_Ceis_Activity_Table_CNT);

// 如果没有则插入到基表

insertable = connElis

.prepareStatement(SQL_Insert_Ceis_Activity_Table);

// 更新VIP产品表的同步标志

update = connVip

.prepareStatement(SQL_UPDATE_PROD_INFO_TO_LCCH_TEMP);

// 查詢產品表

rtype = quertype.executeQuery();

/*

* 基表维护 1、首先取出VIP系统的产品表同步标志为没有同步的数据。

* 2、根据不同的VIP增值服务类型给产品编码拼接前缀查询ceis_activity_table的业务类型如果没有需要插入进去。

* 3、每插入一条到ceis_activity_table表就需要更新VIP系统的产品表同步标志。 4、如果報錯記錄日誌。

* VIP增值服务申请/预约= VIPSV001(需要和产品组合) VIP增值服务订单取消= VIPSV002(需要和产品组合)

* VIP增值服务订单咨询= VIPSV003(不需要和产品组合) VIP增值服务投诉= VIPSV004(不需要和产品组合)

* VIP增值服务使用= VIPSV005(需要和产品组合)

*/

while (rtype.next()) {

logger.info("source Row_id " + rtype.getString("Row_id"));

String[] a = { "VIPSV001_", "VIPSV002_", "VIPSV005_" };

String[] b = { "增值服务申请/预约_", "VIP增值服务订单取消_", "VIP增值服务使用_" };

CommitProdList.add(rtype.getString("Row_id"));

for (int i = 0; i < a.length; i++) {

pcode = null;

String description = null;

pcode = a[i] + rtype.getString("prod_code");

description = b[i] + rtype.getString("prod_name");

querycnt.setString(1, pcode);

qcnt = querycnt.executeQuery();

while (qcnt.next()) {

if (qcnt.getString("cnt").equals("0")) {

insertable.setString(1, null);

insertable.setString(2, "30");

insertable.setString(3, description);

insertable.execute();

}

}

}

CommitProdList.clear();

}

} catch (Exception e) {

logger.info("VIP系统同步到CEIS基表数据报:" + e.getMessage());

for (String rowid : CommitProdList) {

insert_ceis_trace_Log("VIP系统同步到CEIS基表数据报错主键为:"

+ rowid+ "错误信息为:"

+ e.getMessage());

}

CommitProdList.clear();

} finally {

// 关闭连接

try {

if (quertype != null) {

quertype.executeBatch();

quertype.close();

}

if (querycnt != null) {

querycnt.executeBatch();

querycnt.close();

}

if (insertable != null) {

insertable.executeBatch();

insertable.close();

}

if (update != null) {

update.setString(1, "02");

update.execute();

update.close();

}

} catch (SQLException e) {

e.printStackTrace();

logger.info("关闭链接异常" + e.getMessage());

}

}

logger.info("------维护基表结束-----");

/*

* 同步VIP数据到CEIS临时表 1、首先是JOB开关打开、查询VIP系统是否有没有同步的数据。

* 2、逐条处理,根据VIP系统的五项信息查询查询出客户号。 3、查询出来的信息插入到CEIS临时表。 4、更新VIP系统的同步标志。

* 5、关闭连接、记录日志。

*/

try {

// 查询VIP未同步的数据

String sql = SQL_QUERY_Userdefined_LIST;

if (day != null && !"".equals(day)) {

sql = SQL_QUERY_Userdefined_LIST + " where  created> to_date('"

+ day + "','yyyy-mm-dd')and Is_Synchronized='01'";

}

logger.info("VIP系统同步到CEIS临时表查询SQL语句:" + sql);

PreparedStatement psql = connVip.prepareStatement(sql);

// 插入到CEIS的CEIS_CUSTOMER_CONTACT_TMP表

PreparedStatement isql = connElis

.prepareStatement(SQL_INSERT_KIT_INFO_LIST);

// 根据五项信息查询客户号信息

PreparedStatement qclientno = connElis

.prepareStatement(SQL_QUERY_UserClientno_LIST);

// 记录错误日志

PreparedStatement ceislog = connElis

.prepareStatement(SQL_TJS_CEIS_TRACE_LOG);

// 更新VIP系统同步标志

PreparedStatement vipsign = connVip

.prepareStatement(SQL_VIP_UPDATE);

ResultSet rs = null;

ResultSet scup = null;

ResultSet rno = null;

String clientno = null;

List commitDataList = new ArrayList();

try {

psql.setFetchSize(1000);

isql.setFetchSize(1000);

// 查询出VIP系统的同步数据

rs = psql.executeQuery();

ResultSetMetaData rsmt = rs.getMetaData();

// 循环逐条处理

while (rs.next()) {

cnt++;

try {

clientno = null;

// 根据五项信息定位唯一客户

qclientno.setString(1, rs.getString("ID_TYPE"));

qclientno.setString(2, rs.getString("ID_NO"));

qclientno.setString(3, rs.getString("ID_NO"));

qclientno.setString(4, rs.getString("MEM_NAME"));

qclientno.setString(5, rs.getString("DATE_BIRTHDAY"));

qclientno.setString(6, rs.getString("SEX"));

System.out.println("source ID_TYPE "

+ rs.getString("ID_TYPE") + " IDNO "

+ rs.getString("ID_NO") + " CLIENT_NAME "

+ rs.getString("MEM_NAME") + " DATE_BIRTHDAY "

+ rs.getString("DATE_BIRTHDAY") + " SEX "

+ rs.getString("SEX"));

// 查询客户号

rno = qclientno.executeQuery();

rno.next();

if (rno.getRow() == 0) {

logger.info("以上五项信息没有取到客户号");

ceislog.setString(1,

"主键Row_id为" + rs.getString("Row_id")

+ "根据五项信息没有查到对应的客户号");

vipsign.setString(1, "2");

vipsign.executeUpdate();

ceislog.executeUpdate();

} else if (rno.getRow() == 1) {

count++;

// 取到一个客户号,同步数据

clientno = rno.getString("CLIENTNO");

logger.info("clientno取出来的客户号:" + clientno);

commitDataList.add(rs.getString("Row_id"));

isql.setString((1), "30");

isql.setString((2), rs.getString("contact_type_id"));

isql.setString((3), rs.getString("contact_id"));

isql.setString((4), rs.getString("channel_id"));

isql.setTimestamp((5),

rs.getTimestamp("date_start"));

isql.setString(6, clientno);

isql.setString((7), rs.getString("motive_type"));

isql.setString((8), rs.getString("system_id"));

isql.setString((9),

rs.getString("motive_result_id"));

isql.setString((10), rs.getString("activity_id"));

isql.setString((11), rs.getString("activity_type"));

isql.setString((12), rs.getString("url_content"));

isql.setString((13), rs.getString("match_flag"));

// 成功后更新VIP表的同步状态

vipsign.setString(1, "02");

isql.addBatch();

vipsign.addBatch();

}

if (cnt % commitCnt == 0) {// 每1000条提交

isql.executeBatch();

// vipsign.executeBatch();

if (ceislog != null)

ceislog.executeBatch();

commitDataList.clear();

}

} catch (Exception e) {

if (vipsign != null) {

vipsign.close();

}

connElis.rollback();

connVip.rollback();

vipsign = connVip.prepareStatement(SQL_VIP_UPDATE);

for (String rowid : commitDataList) {

insert_ceis_trace_Log("VIP系统同步到CEIS临时表数据报错主键为:"

+ rowid + "错误信息为" + e.getMessage());

count = count - 1;

}

commitDataList.clear();

}

}

// 执行最后一次批量

if (cnt % commitCnt != 0) {

try {

if (isql != null) {

isql.executeBatch();

}

if (vipsign != null) {

vipsign.executeBatch();

}

if (ceislog != null) {

ceislog.executeBatch();

}

commitDataList.clear();

} catch (Exception e) {

if (vipsign != null)

vipsign.close();

connElis.rollback();

vipsign = connVip.prepareStatement(SQL_VIP_UPDATE);

for (String rowid : commitDataList) {

logger.info("VIP系统同步到CEIS临时表数据报错主键为:" + rowid

+ "错误信息为" + e.getMessage());

insert_ceis_trace_Log("VIP系统同步到CEIS临时表数据报错主键为:"

+ rowid + "错误信息为" + e.getMessage());

count = count - 1;

}

commitDataList.clear();

}

}

} catch (Exception e) {

logger.info("VIP系统同步到CEIS临时表数据报错:" + e.getMessage());

} finally {

if (psql != null) {

psql.close();

}

if (isql != null) {

isql.close();

}

if (qclientno != null) {

qclientno.close();

}

if (vipsign != null) {

vipsign.close();

}

if (ceislog != null) {

ceislog.close();

}

}

} catch (Exception e) {

count = (cnt - commitCnt) < 0 ? 0 : (cnt - commitCnt);

logger.info("VIP系统同步到CEIS临时表数据报错" + e.getMessage());

insert_ceis_trace_Log(e.getMessage());

} finally {

insertTjsLog(PRAISE_JOB_NAME, String.valueOf(cnt),

String.valueOf(count));

}

}

// 插入到TJS对账日志表

public void insertTjsLog(String jobName, String sourceCnt, String targetCnt) {

PreparedStatement psql;

try {

psql = connElis.prepareStatement(SQL_TJS_MONITOR_INS);

psql.setString(1, jobName);

psql.setString(2, VIP_DATA_SOURCE);

psql.setString(3, ELIS_DATA_SOURCE);

psql.setString(4, sourceCnt);

psql.setString(5, targetCnt);

psql.executeUpdate();

} catch (SQLException e) {

logger.info("记录TJS日志报错" + e);

e.printStackTrace();

}

}

// 关闭数据库连接

public void close() {

try {

if (connElis != null) {

connElis.close();

}

if (connVip != null) {

connVip.close();

}

} catch (SQLException e) {

logger.error("关闭数据库连接失败", e);

}

}

// 插入到ceis_trace

public void insert_ceis_trace_Log(String trace_info) {

PreparedStatement psql;

try {

psql = connElis.prepareStatement(SQL_TJS_CEIS_TRACE_LOG);

psql.setString(1, trace_info);

psql.execute();

} catch (SQLException e) {

logger.info("记录ceis_trace日志报错" + e);

e.printStackTrace();

}

}

private Map queryForMap(final Connection conn,

final String sql) throws SQLException {

List> list = queryForList(conn, sql);

return list.isEmpty() ? new HashMap() : list.get(0);

}

private int updateSql(final Connection conn, final String sql)

throws SQLException {

PreparedStatement psql = conn.prepareStatement(sql);

return psql.executeUpdate();

}

private List> queryForList(final Connection conn,

final String sql) throws SQLException {

List> resultList = new ArrayList>();

PreparedStatement psql = conn.prepareStatement(sql);

Map dataRow = null;

ResultSet rs = null;

psql.setFetchSize(1000);

rs = psql.executeQuery();

ResultSetMetaData rsmt = rs.getMetaData();

while (rs.next()) {

dataRow = new HashMap();

for (int i = 1; i <= rsmt.getColumnCount(); i++) {

if ("java.lang.String".equals(rsmt.getColumnClassName(i))) {

dataRow.put(rsmt.getColumnLabel(i), rs.getString(i));

} else if ("java.sql.Timestamp".equals(rsmt

.getColumnClassName(i))) {

dataRow.put(rsmt.getColumnLabel(i), rs.getTimestamp(i));

} else if ("java.math.BigDecimal".equals(rsmt

.getColumnClassName(i))) {

dataRow.put(rsmt.getColumnLabel(i), rs.getBigDecimal(i));

} else {

throw new SQLException("Unsupport column type");

}

}

resultList.add(dataRow);

}

return resultList;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值