用户减轻数据压力,提供数据库性能,提供了一级缓存和二级缓存;
一级缓存在操作数据库时需要构造SqlSession对象,在对象中有一个数据结构(HashMap)用户存储缓存数据;用户存储缓存数据,不同的SqlSession之间的缓存数据区域(HashMap)是互不影响的;
如果缓存中数据,就不用去数据库中请求数据,减轻数据库压力;
mybaties默认支持一级缓存,不需要再配置文件中配置;
如果sqlSession去执行了commit操作(插入,更新,删除),情况SqlSession中的以及缓存,这样做的目的是为了让缓存中存储的是最新的信息,避免脏读;
比如:
@Test public void testfindClientByName() throws Exception { SqlSession os = sqlSessionFactory.openSession(); ClientMapper cp = os.getMapper(ClientMapper.class); List<Client> clients = cp.findClientByName("ya"); System.out.println("第一次加载:"+clients); Client c=new Client(); c.setBron_date(new Date()); c.setClient_certificate_no("客户信息"); c.setContact_mode("12121212"); c.setCreate_date(new Date()); c.setFamily_register_address("家庭住址"); c.setId(10009); c.setNow_address("目前的家庭住址"); c.setUrgency_contact_mode("我去"); c.setUsername("萨达姆"); cp.insertIntoClient(c); os.commit(); List<Client> clientss = cp.findClientByName("ya"); System.out.println("第二次加载:"+clientss); os.close(); }
正式开放,将Mybatis和Spring进行整合开发,事务控制在service中,一个service方法中包括了很多mapper方法的调用。
开始执行service时,开启事务,创建SqlSession对象,方法结束SqlSession关闭,清空数据;
如果执行两个service调用查询相同的用户信息,不走一级缓存,因为session方法结束后,sqlsession就关闭了,缓存就清空了;
mybatis默认不开启二级缓存,所以首先开启二级缓存;
二级缓存与一级缓存的区别是:
二级缓存范围更大,多个sqlsession可以共享一个mapper的缓存区域。
二级缓存区域:
按namespace分,每一个mapper有一个缓存区域,两个mapper的namespace如果相同,这两个mapper执行的sql查询到的数据存在相同得二级缓存区域中;
SqlMapConfig.xml : <setting name="cacheEnabled" value="true" /> Mapper.xml : <cache /> 参数 :flushInterval : 刷新间隔 size :缓存的大小,默认1024 ; onlyRead :只读
(3)测试
sqlSession.close();执行关闭操作,将sqlSession中的数据,写入缓存中;
sqlSession.commit(); 执行提交操作,将当前mapper下的缓存清空;(4) 参数:
在statement中 useCache="false" 禁用缓存;针对每次查询都需要最新的数据sql,要设置useCache=false;
<select id="findClientById" parameterType="int" resultType="cn.labelnet.pojo.Client" useCache="true"> select * from f_client where id=#{value} </select>
在statement中 flushCacle="true" 刷新缓存,执行完commit操作,都需要刷新缓存,默认为true,不需要修改;
<select id="findClientById" parameterType="int" resultType="cn.labelnet.pojo.Client" flushCache="true"> select * from f_client where id=#{value} </select>
耗时较高的统计分析 sql ,电话账单查询sql, 实现方法 通过设置刷新间隔时间,由mybatis每隔多长时间只需刷新缓存;
二级缓存对细粒度的数据级别的缓存实现不好,比如:改商品价格,如果mapper.xml中有一个执行了commit操作,那么缓存就会被清空;