1. 程式人生 > 其它 >MVCC多版本併發控制

MVCC多版本併發控制

思考 https://www.zhihu.com/question/270387939/answer/360487647
https://blog.csdn.net/isea533/category_2092001.html

Mybatis 客戶端呼叫過程

// 載入配置
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 構建核心工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "development");
// 建立會話
SqlSession session = sqlSessionFactory.openSession();
// 動態代理,生成Dao層介面物件
IUser userMapper = session.getMapper(IUser.class);

Executor

執行器 定義瞭如query,update,commit,rollback等資料庫操作的基本方法。
Executor是DefaultSqlSession的成員變數,在openSession時建立,可以指定使用哪個Executor的實現類,未指定預設使用ExecutorType.SIMPLE;也可以通過配置settings.defaultExecutorType屬性來指定預設執行器

CachingExecutor:二級快取執行器(settings.cacheEnabled未配置情況下,預設開啟);使用裝飾器模式,內部引用了BaseExecutor。
BaseExecutor:是SimpleExecutor,ReuseExecutor,BatchExecutor三個執行器的抽象父類。

Plugins

MyBatis 允許你在對映語句執行過程中的某一點進行攔截呼叫。預設情況下,MyBatis 允許使用外掛來攔截的方法呼叫包括:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)

通過 MyBatis 提供的強大機制,使用外掛是非常簡單的,只需實現 Interceptor 介面,並指定想要攔截的方法簽名即可。

@Intercepts({@Signature(
  type= Executor.class,
  method = "update",
  args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
  private Properties properties = new Properties();
  public Object intercept(Invocation invocation) throws Throwable {
    // implement pre processing if need
    Object returnObject = invocation.proceed();
    // implement post processing if need
    return returnObject;
  }
  public void setProperties(Properties properties) {
    this.properties = properties;
  }
}
<!-- mybatis-config.xml -->
<plugins>
  <plugin interceptor="org.mybatis.example.ExamplePlugin">
    <property name="someProperty" value="100"/>
  </plugin>
</plugins>

上面的外掛將會攔截在 Executor 例項中所有的 “update” 方法呼叫, 這裡的 Executor 是負責執行底層對映語句的內部物件。

SqlSessionFactoryBuilder

// 構造器
private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
    super(new Configuration()); // 建立Configuration物件
    ErrorContext.instance().resource("SQL Mapper Configuration");
    this.configuration.setVariables(props);
    this.parsed = false;
    this.environment = environment;
    this.parser = parser;
}

詳細的Configuration配置及屬性含義可以參考官網 https://mybatis.org/mybatis-3/zh/configuration.html