Mybatis實現指定時間db只讀方案

qixiaobo發表於2018-01-05

title: Mybatis實現指定時間db只讀方案 tags:

  • mybatis
  • interceptor
  • readonly categories: mybatis date: 2017-10-11 21:33:27

背景

  1. 由於定時任務集計要求,在每天凌晨指定時間需要做庫表備份
  2. 如果使用者對於某些資料進行操作可能導致一些資料不平   【庫存】凌晨00:00:00-00:10:00之間有備份操作,發生出入庫導致庫存不平
  3. 需要將應用只讀化

思考

  1. 將db只讀,想到方案可以將db連線只讀,這樣所有的請求過來都會報錯(只讀賬戶)

  2. 切面將db相關操作劃分

    1. spring aop切面,將讀寫操作區分
    2. mybatis攔截器將讀寫操作區分
  3. 通過某種方法將所有的寫入口禁掉(比如shiro禁掉寫許可權【只針對web】,但是可能無法使用防止service)

方案

  1. 將db只讀方案可以適用於已經實現讀寫分離專案(需要在指定時間或者條件下直接使用只讀資料來源)
  2. 如果spring切面要求命名規範所有的update delete insert等方法不可以使用,mybatis interceptor天生就自帶區分讀寫功能推薦2b方案
  3. 比較困難正如上述描述通過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

當然在前端畫面加上適當的顯式提示即可!

程式碼比較簡潔易懂。

推薦該方案

相關文章