mybatis知识点总结1

176 阅读2分钟

mybatis将它自己的数据源分为三类:

1.unpooled  不使用连接池的数据源

2.pooled 使用连接池的数据源

3.jndi 使用jndi实现的数据源

\

相应的,mybatis内部分别定义了实现了java.sql.Datasource接

口的unpooledDatasource,PooledDataSource类来表示

unpooled\pooled类型的数据源

\

PooledDataSource和UnpooledDataSource都实现了java.sql

DataSource接口,并且,pooledDataSource 持有一个UnPoo

ledDataSource的引用,当pooledDataSource需要创建java.sq

l.Connection实例对象时,是通过unpooledDataSource来创建

的。PooledDataSource只是提供一种缓存连接池机制,在这三

种数据源中,我们一般采用的是pooled数据源(很多时候我们

所说的数据源就是为了更好的管理数据库连接,也就是我们所说

的连接池技术)

\

mybatis查询缓存的作用域是根据映射文件mapper的namesp

ce划分的,相同namespace的mapper查询的数据存放在同一

个缓存区域。不同的namespace下的数据互不干扰。无论一级

还是二级缓存,都是按照namespace进行分别存放的。但是一

级缓存与二级缓存的不同之处就在于,sqlSession一旦关闭,则

sqlSession中的缓存中的数据将不存在,即1级缓存不存在了。

而二级缓存的生命周期与整个应用同步(sqlSessionFactory)

与sqlSession是否关闭无关。一级缓存是在同一个线程间共享的

数据,二级缓存则是在不同的线程(sqlSession)间共享数据

\

1.增删改同样也会清空二级缓存

2.对于二级缓存的清空,实质上是对所查找key对应的value置为

null,而并非将<key,value>清除,也就是entry对象

3.从数据库进行查询的条件是:缓存中根本不存在这个可以,或

这个entry对象为null

\

二级缓存的使用原则:

1.多个namespace不要操作同一张表

由于二级缓存中的数据是基于namespace的,即不同namespace中的数据互不干扰。若某个用户在某个namespace

下对表执行了

增删改操作,该操作只会引发当前namespace下的二级缓存的

刷新,而对其它namespace下的二级缓存没有影响。这样的

话,其他二级缓存依然是未更新

的数据,也就出现了多个namespace中的数据不一致现象。\

2 不要在关联关系表上执行增删改操作

\

一个namespace一般是对同一个表进行操作,若表间存在关联

关系,也就意味着同一个表可能就会出现在多个namespace

中。这样也就存在一个风险,若某一个

namespace中对一个表进行增删改操作时影响到了其关联的数

据,而这个关联表的数据的修改只会刷新当前namespace下的

二级缓存,而对另一namespace下的二级缓冲数据没有影响


3查询多余修改时 使用二级缓存\