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查询多余修改时 使用二级缓存\