initial commit

This commit is contained in:
chenjinsong
2018-09-27 16:25:51 +08:00
commit 4929220ca9
29 changed files with 1461 additions and 0 deletions

View File

@@ -0,0 +1,117 @@
package com.nms.interceptor;
import java.util.List;
import org.apache.log4j.Logger;
import com.alibaba.fastjson.JSON;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.nms.model.SyncDbInfo;
import com.nms.thread.SyncThread;
public class SyncDataInterceptor implements Interceptor{
private Logger logger =Logger.getLogger(this.getClass());
@Override
public void intercept(Invocation inv) {
try{
logger.info("--------数据同步前 syncDataInterceptor拦截器拦截------------");
SyncThread target = inv.getTarget();
SyncDbInfo syncDbInfo = target.getSyncDbInfo();
String url = "jdbc:mysql://" + syncDbInfo.get("ip") + ":" + syncDbInfo.get("port") + "/"
+ syncDbInfo.get("database_name");
logger.info("当前数据库连接为 "+url);
//同步数据前 取出metadata表中最后一次同步的id信息 获取新增的数据信息 方便接下来修改表结构
Record metadataTableSyncInfo = Db.use("masterDataSource").findFirst("select * from table_sync_info where table_name='metadata' and event=1 and db_id=?",syncDbInfo.getId());
logger.info("获取metadata表中最后一次同步id的数据信息为 "+JSON.toJSONString(metadataTableSyncInfo));
//开始执行同步过程
inv.invoke();
//处理同步数据结束
//判断metadata表 是否有新增数据 如果有执行sql 修改表结构
if(metadataTableSyncInfo!=null){
List<Record> metadatas = Db.use(url).find("select m.*,cti.table_name from metadata m left join check_type_info cti on m.check_type_id=cti.id where m.id > ? ",metadataTableSyncInfo.getLong("last_id"));
logger.info("metadata表中新增数据信息查询结果为 "+JSON.toJSONString(metadatas));
if(metadatas!=null && metadatas.size()>0){
for(Record metadata:metadatas){
Record isExist = Db.use(url).findFirst("select COUNT(1) count from information_schema.`TABLES` WHERE TABLE_SCHEMA = '"+syncDbInfo.getStr("database_name")+"' and UPPER(TABLE_NAME) = ?",metadata.getStr("table_name"));
logger.info("判断metadata表新增数据是修改还是新增表操作结果为"+JSON.toJSONString(isExist));
//向数据库中添加新的字段
if(isExist.getInt("count")>0){
StringBuffer sqlString = new StringBuffer("alter table ");
sqlString.append(metadata.getStr("table_name").toUpperCase());
sqlString.append(" add(");
sqlString.append(metadata.getStr("filed_name")+" "+ toMysqlType(metadata.getStr("filed_type"))+")");
logger.info("修改metadata表结构 sql语句为"+sqlString.toString());
//执行添加字段
int resu =Db.use(url).update(sqlString.toString());
logger.info("修改表结构结果为 "+resu);
}
}
}
}
//判断check_type_info表 是否有新增数据 如果有执行存储过程 创建新表
List<Record> checkTypeInfos = Db.use(url).find(" select * from check_type_info where crete_state=0 ");
for(Record checkTypeInfo : checkTypeInfos){
//判断表是否存在
Record isExist = Db.use(url).findFirst("select COUNT(1) count from information_schema.`TABLES` WHERE TABLE_SCHEMA = '"+syncDbInfo.getStr("database_name")+"' and UPPER(TABLE_NAME) = ?",checkTypeInfo.getStr("TABLE_NAME"));
logger.info("check_type_info表中有新增数据 判断表是否创建"+JSON.toJSONString(isExist));
if(isExist.getInt("count")>0){
continue;
}else{
//创建表数据
String filedName ="";
String filedType ="";
StringBuffer sql= new StringBuffer();
StringBuffer cIndexFileds = new StringBuffer("data_check_time:seq_id:detection_set_info_id:");
List<Record> metadatas2 = Db.use(url).find("select * from metadata where 1=1 and check_type_id=? and state = '0' order by show_num asc",checkTypeInfo.getLong("ID"));
if(metadatas2!=null && metadatas2.size()>0) {
for(int i=0;i<metadatas2.size();i++){
filedName = metadatas2.get(i).getStr("filed_name");
sql.append(filedName+" ");
filedType = metadatas2.get(i).getStr("filed_type");
if(i != metadatas2.size()-1){
sql.append(toMysqlType(filedType)+",");
}else{
sql.append(toMysqlType(filedType));
}
//判断是否为统计
if(metadatas2.get(i).getStr("chart_state").equals("0")){
cIndexFileds.append(metadatas2.get(i).getStr("chart_state")+":");
}
}
}
logger.info("check_type_info新增数据创建表结构 参数信息 调用存储过程名称 pro_createTable");
logger.info("check_type_info新增数据创建表结构 参数信息 表名"+checkTypeInfo.getStr("TABLE_NAME"));
logger.info("check_type_info新增数据创建表结构 参数信息 sql"+sql.toString());
logger.info("check_type_info新增数据创建表结构 参数信息 字段名称"+cIndexFileds.toString());
SyncStoredProcedure syncStoreProcedure=new SyncStoredProcedure("pro_createTable",checkTypeInfo.getStr("TABLE_NAME"), sql.toString(),cIndexFileds.toString());
Db.use(url).execute(syncStoreProcedure);
logger.info("创建新表操作完成");
}
}
logger.info("--------数据同步前 syncDataInterceptor拦截器拦截结束------------");
}catch(Exception e){
e.printStackTrace();
logger.info("syncDataInterceptor拦截器内部程序出现异常信息"+e.getMessage());
}
}
private static String toMysqlType(String type){
type = type.trim().toLowerCase();
if(type.startsWith("date")){
type = type.replaceAll("date", "datetime");
}else if(type.startsWith("number")){
type = type.replaceAll("number", "bigint");
}else if(type.startsWith("varchar")){
type = type.replaceAll("varchar2", "varchar");
}
return type;
}
}

View File

@@ -0,0 +1,51 @@
package com.nms.interceptor;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.log4j.Logger;
import com.jfinal.plugin.activerecord.ICallback;
public class SyncStoredProcedure implements ICallback{
private Logger logger=Logger.getLogger(this.getClass());
private String proName;
private String tableName;
private String filedAndType;
private String fileds;
public SyncStoredProcedure(String proName, String tableName, String filedAndType, String fileds) {
super();
this.proName = proName;
this.tableName = tableName;
this.filedAndType = filedAndType;
this.fileds = fileds;
}
@Override
public Object call(Connection conn) throws SQLException {
logger.info("开始调用存储过程任务");
CallableStatement proc=null;
try{
proc=conn.prepareCall("{call "+proName+"(?,?,?)}");
proc.setString(1,tableName);
proc.setString(2,filedAndType);
proc.setString(3, fileds);
proc.execute();
logger.info("调用存储过程任务结束");
} catch (Exception e){
logger.info("调用存储过程任务出现错误 存储过程名称"+proName+" 表名"+tableName+"参数 "+filedAndType+"------"+fileds);
e.printStackTrace();
} finally{
if(conn!=null){
conn.close();
}
if(proc!=null){
proc.close();
}
}
return null;
}
}