什么是网站建设的重点,易县做网站的在哪,军事最新消息中国,注册科技有限公司经营范围1、保持redis和mysql连接的一致性#xff1a;通常使用延迟双删功能#xff08;具有弊端#xff09; 解决方案#xff1a;可以使用canal监听数据库的变化#xff08;删改#xff09;#xff0c;一旦出现此类操作#xff0c;立即删除redis中的对应数据#xff0c;直至下… 1、保持redis和mysql连接的一致性通常使用延迟双删功能具有弊端 解决方案可以使用canal监听数据库的变化删改一旦出现此类操作立即删除redis中的对应数据直至下次使用该数据时从数据库中查找后新数据写入redis中。 2、如何监听表的字段可以使用mybatis的拦截器进行(见下文) 更优方案通过canal监听数据库的变化会返回一个json串可以解析json串来监听数据表或者数据表中的字段名 一、MyBatis拦截器-笔试题
1.笔试题 ORM使用的是mybatis请提供记录字段级变更日志的技术方案。 需求 1.可以指定表进行监控 2.可以指定表中的某些字段进行监控 2.实现
2.1 引入解析器
什么是JSqlParser JSqlParser 是一个 SQL 语句解析器。 它将 SQL转换为可遍历的 Java 类层次结构。 添加依赖
dependencygroupIdcom.github.jsqlparser/groupIdartifactIdjsqlparser/artifactIdversion4.6/version/dependency2.2 添加拦截器
Component
Intercepts({// 指定要拦截的方法签名这里是拦截Executor的update方法Signature(type StatementHandler.class, method update, args {Statement.class}),// 可以添加更多要拦截的方法签名...
})
Slf4j
public class MonitorInterceptor implements Interceptor {private static ListString MONITOR_TABLES CollUtil.newArrayList(205_product);private static ListString MONITOR_COLUMNS CollUtil.newArrayList(price);Overridepublic Object intercept(Invocation invocation) throws Throwable {StatementHandler statementHandler (StatementHandler)(invocation.getTarget());BoundSql boundSql statementHandler.getBoundSql();String sql boundSql.getSql();net.sf.jsqlparser.statement.Statement statement CCJSqlParserUtil.parse(sql);if(statement instanceof Update){Update update (Update)statement;String table update.getTable().getName();if(MONITOR_TABLES.contains(table)){log.info(表 {} 更改了, table);ArrayListUpdateSet updateSets update.getUpdateSets();updateSets.forEach(item - item.getColumns().forEach(item2 - {if(MONITOR_COLUMNS.contains(item2.getColumnName())){sendDingding(table);}}));}}return invocation.proceed();}private void sendDingding(String table){String url https://oapi.dingtalk.com/robot/send?access_tokenddaea71f9ed09a0cd0fe1a28e18fadb618a4e0cee829c0534d48b3273dd9e644;JSONObject msg new JSONObject();msg.set(msgtype, markdown);msg.set(markdown, new JSONObject().set(title, LocalUserUtil.getLocalUser().getNickName() 更改了表 table ).set(text, 更改了价格请审核 ));msg.set(at, new JSONObject().set(isAtAll, true));String json JSONUtil.toJsonStr(msg);String result HttpRequest.post(url).body(json).execute().body();}
}