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返回结果集等;
  

猜你喜欢

转载自www.cnblogs.com/qwangxiao/p/10139717.html