最近項目中出現了至少兩次因為Mybatis的動態where條件不滿足導致實際sql語句的where條件為空,進而查詢全表,當數據量比較大的時候,導致OOM的情況.
如何禁止這種情況,個人覺得三種措施:
- 1.在邏輯層面加充分的參數有效性檢查;
- 2.在where條件中如果索引條件都不滿足,加上1=2這種必然失敗的條件;
- 3.Mybatis攔截器;
-
前兩種措施都是依賴人,從這個層面講,是不靠譜的,即一個策略不是強制的,就是不靠譜的.相對而言,第三種是不依賴程序員的自覺性,是最靠譜的.乘周六有時間,實現一個簡單的Mybatis攔截器來攔截where條件為空的SQL語句.
1.實現
先上代碼,這里攔截了SqlCommandType為select,update,delete這三種類型.出現情況目前只是打日志.
包括一個簡單反射工具的實現:
- /** * 反射工具 * * @author: xiaobaoqiu Date: 15-8-22 Time: 上午11:52 */
2.Mybatis的Interceptor原理
這篇文章很好的解釋了Mybatis的Interceptor機制.
mybatis讀取配置再xml文件中Interceptor,通過反射構造其實例,將所有的Interceptor保存到InterceptorChain中。
mybatis的攔截器只能代理指定的四個類:ParameterHandler、ResultSetHandler、StatementHandler以及Executor。
參考: