title: Mybatis實現指定時間db只讀方案 tags:
- mybatis
- interceptor
- readonly categories: mybatis date: 2017-10-11 21:33:27
背景
- 由於定時任務集計要求,在每天凌晨指定時間需要做庫表備份
- 如果使用者對於某些資料進行操作可能導致一些資料不平 【庫存】凌晨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) {
}
}
複製程式碼
當然在前端畫面加上適當的顯式提示即可!
程式碼比較簡潔易懂。
推薦該方案