1. 程式人生 > >Mybatis快取機制及mybatis的各個組成部分

Mybatis快取機制及mybatis的各個組成部分

  Mybatis
  
  一級快取: 基於PerpetualCache 的 HashMap本地快取,其儲存作用域為 Session,當 Session flush 或 close 之後,該Session中的所有 Cache 就將清空。
  
  2. 二級快取與一級快取其機制相同,預設也是採用 PerpetualCache,HashMap儲存,不同在於其儲存作用域為 Mapper(Namespace),並且可自定義儲存源,如 Ehcache。
  
  3. 對於快取資料更新機制,當某一個作用域(一級快取Session/二級快取Namespaces)的進行了 C/U/D 操作後,預設該作用域下所有 select 中的快取將被clear。
  
  二級快取補充說明
  
  1. 對映語句檔案中的所有select語句將會被快取。
  
  2. 對映語句檔案中的所有insert,update和delete語句會重新整理快取。
  
  3. 快取會使用Least Recently Used(LRU,最近最少使用的)演算法來收回。
  
  4. 快取會根據指定的時間間隔來重新整理。
  
  5. 快取會儲存1024個物件
  
  mybatis快取機制:
  
  mybatis中的快取分為兩種:一級快取(預設為一級快取)和二級快取,使用mybatis會聽說過一級快取時sqlsession級別的,SqlSession快取的作用域僅限當前SqlSession,二級快取時mapper級別的,因為不同的mapper通常情況下有不同的namespace,就都有一個二級快取,也就是說不同的mapper之間的二級快取是互不影響的。
  
  從圖中可以看出:
  
  sqlSession1去查詢使用者id為1的使用者資訊,查詢到使用者資訊會將查詢資料儲存到該UserMapper的二級快取中。
  
  如果SqlSession3去執行相同 mapper下sql,執行commit提交,則會清空該UserMapper下二級快取區域的資料。
  
  sqlSession2去查詢使用者id為1的使用者資訊,去快取中找是否存在資料,如果存在直接從快取中取出資料。
  
  當使用用一個sqlsession時,查詢到的資料可能是一級快取,而當使用同一個mapper時,查詢到的資料可能是二級快取。
  
  mybatis的一級快取:
  
  執行查詢時,sqlsession是將任務交給executor來完成對資料庫的操作。
  
  mybatis的二級快取:
  
  在mapper檔案中配置cacheEnabled時,就會開啟二級快取,二級快取時mapper級別的,也就是說不同的sqlsession使用同一個mapper查詢時。查詢到的資料可能是另一個sqlsession做相同操作留下的快取。
  
  SqlSession物件建立Executor物件時,會對Executor物件加上一個裝飾者:CachingExecutor,然後將操作資料庫的任務交給CachingExecutor,此時CachingExecutor會查詢二級快取是否有需要的資料,如果沒有則將任務交給Executor物件。
  
  配置了二級快取,那麼查詢資料的順序應該為:二級快取→一級快取→資料庫。
  
  二級快取的應用場景和侷限性:
  
  對於訪問多的查詢請求且使用者對查詢結果實時性要求不高,此時可採用mybatis二級快取技術降低資料庫訪問量,提高訪問速度。業務場景比如:耗時較高的統計分析sql、電話賬單查詢sql等。實現方法如下:通過設定重新整理間隔時間,由mybatis每隔一段時間自動清空快取,根據資料變化頻率設定快取重新整理間隔flushInterval,比如設定為30分鐘、60分鐘、24小時等,根據需求而定。
  
  mybatis二級快取對細粒度的資料級別的快取實現不好,比如如下需求:對商品資訊進行快取,由於商品資訊查詢訪問量大,但是要求使用者每次都能查詢最新的商品資訊,此時如果使用mybatis的二級快取就無法實現當一個商品變化時只重新整理該商品的快取資訊而不重新整理其它商品的資訊,因為mybaits的二級快取區域以mapper為單位劃分的,當一個商品資訊變化會將所有商品資訊的快取資料全部清空。解決此類問題可能需要在業務層根據需求對資料有針對性快取。
  
  MyBatis本身提供的多種快取實現運用了裝飾者模式,對於自定義快取的實現只需要實現MyBatis提供的Cache介面即可。為保證資料的實時有效性,避免引起髒資料尤其是在分散式的環境下,通常情況下不會開啟二級快取,亦或是結合第三方快取Ehcache或者Redis來實現。
  
  一級快取的生命週期有多長?
  
def create_softmax_network(self):
# network weights
W1 = self.weight_variable([self.state_dim, 20])
b1 = self.bias_variable([20])
W2 = self.weight_variable([20, self.action_dim])
b2 = self.bias_variable([self.action_dim])
# input layer
self.state_input = tf.placeholder("float", [None, self.state_dim])
self.tf_acts = tf.placeholder(tf.int32, [None,www.gcyl152.com ], name="actions_num")
self.tf_vt = tf.placeholder(tf.float32, www.yigouyule2.cn [None, ], name="actions_value")
# hidden layers
h_layer = tf.nn.relu(tf www.tiaotiaoylzc.com/ matmul(self.state_input, W1) + b1)
# softmax layer
self.softmax_input yongshiyule178.com= tf.matmul(h_layer,www.mcyllpt.com W2) + b2
#softmax output
self.all_act_prob = tf.nn.softmax(self.softmax_input, name='act_prob')
self.neg_log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.softmax_input,

  a、MyBatis在開啟一個數據庫會話時,會 建立一個新的SqlSession物件,SqlSession物件中會有一個新的Executor物件。Executor物件中持有一個新的PerpetualCache物件;當會話結束時,SqlSession物件及其內部的Executor物件還有PerpetualCache物件也一併釋放掉。
  
  b、如果SqlSession呼叫了close()方法,會釋放掉一級快取PerpetualCache物件,一級快取將不可用。
  
  c、如果SqlSession呼叫了clearCache(),會清空PerpetualCache物件中的資料,但是該物件仍可使用。
  
  d、SqlSession中執行了任何一個update操作(update()、delete()、insert()) ,都會清空PerpetualCache物件的資料,但是該物件可以繼續使用
  
  MyBatis各個組成部分介紹:
  
  1、 MyBatis全域性配置核心配置檔案SqlMapConfig.xml包括資料來源配置資訊、事務資訊、開啟二級快取、載入Mapper對映配置等。
  
  UserMapper.xml、DeptMapper.xml、LoginMapper.xml等檔案統稱為mapper對映檔案,其作用是編寫SQL語句、指定接收引數型別、指定返回結果型別等操作。所有mapper對映檔案必須在SqlMapConfig.xml檔案中指定載入;
  
  2、SqlSessionFactoryBuilder().build(MyBatis核心配置SqlMapConfig.xml檔案輸入流)構建會話工廠SqlSessionFactory,用於生產SqlSession會話物件;
  
  3、根據會話工廠SqlSessionFactory獲取SqlSession會話物件,開發者可以根據SqlSesion會話物件的API操作資料庫;
  
  4、Executor執行器,操作SqlSession會話執行CRUD操作最終交由Executor執行器完成;
  
  5、Mapped Statement封裝了SQL已經引數對映以及封裝執行SQL返回結果集等;