mybatis原始碼解讀:executor包(錯誤上下文)
阿新 • • 發佈:2021-02-11
技術標籤:mybaits原始碼mybatis
ErrorContext類是一個錯誤上下文,能夠提前將一些背景資訊儲存下來。這樣在真正發生錯誤時,便能將這些背景資訊提供處理,進而給我們的錯誤排查帶來便利。
public class ErrorContext { // 獲得當前作業系統的換行符 private static final String LINE_SEPARATOR = System.getProperty("line.separator","\n"); // 將自身儲存進ThreadLocal,從而進行執行緒間的隔離 private static final ThreadLocal<ErrorContext> LOCAL = new ThreadLocal<>(); // 儲存上一版本的自身,從而組成錯誤鏈 private ErrorContext stored; // 下面幾條為錯誤的詳細資訊,可以寫入一項或者多項 private String resource; private String activity; private String object; private String message; private String sql; private Throwable cause; private ErrorContext() { } /** * 從ThreadLocal取出已經例項化的ErrorContext,或者例項化一個ErrorContext放入ThreadLocal * @return ErrorContext例項 */ public static ErrorContext instance() { ErrorContext context = LOCAL.get(); if (context == null) { context = new ErrorContext(); LOCAL.set(context); } return context; } /** * 建立一個包裝了原有ErrorContext的新ErrorContext * @return 新的ErrorContext */ public ErrorContext store() { ErrorContext newContext = new ErrorContext(); newContext.stored = this; LOCAL.set(newContext); return LOCAL.get(); } /** * 剝離出當前ErrorContext的內部ErrorContext * @return 剝離出的ErrorContext物件 */ public ErrorContext recall() { if (stored != null) { LOCAL.set(stored); stored = null; } return LOCAL.get(); } }
ErrorContext類實現了單例模式,而它的單例是繫結到ThreadLocal上的。這保證了每個執行緒都有唯一的一個錯誤上下文ErrorContext。ErrorContext類有一種包裝機制,即每個ErrorContext物件內還可以保證一個ErrorContext物件,這樣錯誤上下文就可以組成一條錯誤鏈。
歡迎關注本人公眾號: