1. 程式人生 > 其它 >mybatis原始碼解讀:executor包(錯誤上下文)

mybatis原始碼解讀:executor包(錯誤上下文)

技術標籤: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物件,這樣錯誤上下文就可以組成一條錯誤鏈。

歡迎關注本人公眾號: