背景
- 由于定时任务集计要求,在每天凌晨指定时间需要做库表备份
- 如果用户对于某些数据进行操作可能导致一些数据不平 【库存】凌晨00:00:00-00:10:00之间有备份操作,发生出入库导致库存不平
- 需要将应用只读化
思考
-
将db只读,想到方案可以将db连接只读,这样所有的请求过来都会报错(只读账户)
-
切面将db相关操作划分
- spring aop切面,将读写操作区分
- mybatis拦截器将读写操作区分
-
通过某种方法将所有的写入口禁掉(比如shiro禁掉写权限【只针对web】,但是可能无法使用防止service)
方案
- 将db只读方案可以适用于已经实现读写分离项目(需要在指定时间或者条件下直接使用只读数据源)
- 如果spring切面要求命名规范所有的update delete insert等方法不可以使用,mybatis interceptor天生就自带区分读写功能推荐2b方案
- 比较困难正如上述描述通过dubbo等方式公布出去的可能不能控制
实现
伪代码如下:
package com.air.tqb.mybatis.intercepts;
import com.air.tqb.Exception.BussinessException;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
import org.apache.ibatis.plugin.*;
import java.sql.Statement;
import java.util.Properties;
@Intercepts({
@Signature(type = StatementHandler.class, method = "update", args = {Statement.class})})
public class MyBatisReadOnlyInterceptor implements Interceptor {
private final static Log logger = LogFactory.getLog(MyBatisReadOnlyInterceptor.class);
private Properties properties;
public Object intercept(Invocation invocation) throws Throwable {
if (condition) {
throw new BussinessException("当前时间只能查看,无法进行新增修改删除操作!");
}
return invocation.proceed();
}
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties0) {
}
}
213210_XCAp_871390.png
当然在前端画面加上适当的显式提示即可!
代码比较简洁易懂。
推荐该方案
网友评论