全局表一致性的定时检测的实现
根据 Leader-us 的要求:
“增加 mycat 新任务,全局表定义中,需要有一个时间戳字段,每次记录的 update,insert,
确保 时间字段赋值,并且 mycat 增加定时检测逻辑,检测记录总量,以及最新时间戳的匹
配,简单有效的发现全局表不一致的问题。/ 测试修复类 / 1.5&2.0 /12.9 /leader-us”
全局表一致性定时检测主要分为两个部分:
1. SQL 拦截部分
主要实现对所有全局表中记录进行修改的语句进行拦截,比如:
ServerParse.INSERT,
ServerParse.UPDATE,
ServerParse.REPLACE(mycat-server 不支持)
对所有对全局表的 insert, update 操作进行拦截,首先判断该全局表是否存在一个记录
时间戳的内部列_mycat_op_time:
public class GlobalTableUtil{
/** 全局表 保存修改时间戳的字段名,用于全局表一致性检查 */
public static final String GLOBAL_TABLE_MYCAT_COLUMN = "_mycat_op_time";
如果不存在,输出警告,哪个 db 的哪个全局表没有内部列:
if(innerColumnNotExist.size() > 0){
for(SQLQueryResult<Map<String, String>> map : innerColumnNotExist){
if(tableName.equalsIgnoreCase(map.getTableName())){
StringBuilder warnStr = new StringBuilder();
if(map != null)
warnStr.append(map.getDataNode()).append(".");
warnStr.append(tableName).append(" inner column: ")
.append(GlobalTableUtil.GLOBAL_TABLE_MYCAT_COLUMN)
.append(" is not exist.");
LOGGER.warn(warnStr.toString());
return sql;
}
}