mybatis 子查询缓存不生效

weixin_38063173 2014-04-04 01:25:05
 开发四年只会写业务代码,分布式高并发都不会还做程序员?->>>    以上是两张表,省份表与地市 ProvinceMapper @CacheNamespace(implementation=org.mybatis.caches.ehcache.EhcacheCache.class) public interface ProvinceMapper { @Select("select id,province_name provinceName,province_code provinceCode,order_num orderNum from province where id=#{id}") Province get(Integer id); } CityMapper public interface CityMapper { @Select("select id,city_name,city_code,province_id from city where id=#{id}") @Results(value={ @Result(property="id",column="id",id=true), @Result(property="cityName",column="city_name"), @Result(property="cityCode",column="city_code"), @Result(property="province",column="province_id",javaType=Province.class, one=@One(select="org.qh.mapper.ProvinceMapper.get")) }) City get(Integer id); } 我用如下的代码进行测试 @Test public void test2() { SqlSession session = null; /* session = sqlSessionFactory.openSession(); ProvinceMapper provinceMapper = session.getMapper(ProvinceMapper.class); Province province = provinceMapper.get(9); session.close(); */ session = sqlSessionFactory.openSession(); CityMapper cityMapper = session.getMapper(CityMapper.class); City city = cityMapper.get(7); assertNotNull(city); session.close(); session = sqlSessionFactory.openSession(); cityMapper = session.getMapper(CityMapper.class); city = cityMapper.get(7); assertNotNull(city); session.close(); } 输出日志 net.sf.ehcache.config.ConfigurationHelper - CacheDecoratorFactory not configured for defaultCache. Skipping for 'org.qh.mapper.ProvinceMapper'. org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 168242572. org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@a072d8c] org.qh.mapper.CityMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@a072d8c] org.qh.mapper.CityMapper.get - ==> Preparing: select id,city_name,city_code,province_id from city where id=? org.qh.mapper.CityMapper.get - ==> Parameters: 7(Integer) org.qh.mapper.ProvinceMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@a072d8c] org.qh.mapper.ProvinceMapper.get - ==> Preparing: select id,province_name provinceName,province_code provinceCode,order_num orderNum from province where id=? org.qh.mapper.ProvinceMapper.get - ==> Parameters: 9(Integer) org.qh.mapper.ProvinceMapper.get - <== Total: 1 org.qh.mapper.CityMapper.get - <== Total: 1 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@a072d8c] org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@a072d8c] org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 168242572 to pool. org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection org.apache.ibatis.datasource.pooled.PooledDataSource - Checked out connection 168242572 from pool. org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@a072d8c] org.qh.mapper.CityMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@a072d8c] org.qh.mapper.CityMapper.get - ==> Preparing: select id,city_name,city_code,province_id from city where id=? org.qh.mapper.CityMapper.get - ==> Parameters: 7(Integer) org.qh.mapper.ProvinceMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@a072d8c] org.qh.mapper.ProvinceMapper.get - ==> Preparing: select id,province_name provinceName,province_code provinceCode,order_num orderNum from province where id=? org.qh.mapper.ProvinceMapper.get - ==> Parameters: 9(Integer) org.qh.mapper.ProvinceMapper.get - <== Total: 1 org.qh.mapper.CityMapper.get - <== Total: 1 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@a072d8c] org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@a072d8c] org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 168242572 to pool. 很明显city的子查询每一次都要查询province 如果先查询一次Province,将查询结果会被缓存中,之后子查询会用到缓存 @Test public void test2() { SqlSession session = null; session = sqlSessionFactory.openSession(); ProvinceMapper provinceMapper = session.getMapper(ProvinceMapper.class); Province province = provinceMapper.get(9); session.close(); session = sqlSessionFactory.openSession(); CityMapper cityMapper = session.getMapper(CityMapper.class); City city = cityMapper.get(7); assertNotNull(city); session.close(); session = sqlSessionFactory.openSession(); cityMapper = session.getMapper(CityMapper.class); city = cityMapper.get(7); assertNotNull(city); session.close(); } net.sf.ehcache.config.ConfigurationHelper - CacheDecoratorFactory not configured for defaultCache. Skipping for 'org.qh.mapper.ProvinceMapper'. org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 1440671952. org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0] org.qh.mapper.ProvinceMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0] org.qh.mapper.ProvinceMapper.get - ==> Preparing: select id,province_name provinceName,province_code provinceCode,order_num orderNum from province where id=? org.qh.mapper.ProvinceMapper.get - ==> Parameters: 9(Integer) org.qh.mapper.ProvinceMapper.get - <== Total: 1 net.sf.ehcache.store.disk.Segment - put added 0 on heap org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0] org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0] org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1440671952 to pool. org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection org.apache.ibatis.datasource.pooled.PooledDataSource - Checked out connection 1440671952 from pool. org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0] org.qh.mapper.CityMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0] org.qh.mapper.CityMapper.get - ==> Preparing: select id,city_name,city_code,province_id from city where id=? org.qh.mapper.CityMapper.get - ==> Parameters: 7(Integer) org.qh.mapper.CityMapper.get - <== Total: 1 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0] org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0] org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1440671952 to pool. org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection org.apache.ibatis.datasource.pooled.PooledDataSource - Checked out connection 1440671952 from pool. org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0] org.qh.mapper.CityMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0] org.qh.mapper.CityMapper.get - ==> Preparing: select id,city_name,city_code,province_id from city where id=? org.qh.mapper.CityMapper.get - ==> Parameters: 7(Integer) org.qh.mapper.CityMapper.get - <== Total: 1 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0] org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0] org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1440671952 to pool. net.sf.ehcache.store.disk.Segment - fault removed 0 from heap net.sf.ehcache.store.disk.Segment - fault added 0 on disk 很明显缓存起到作用了。 通过以上测试,难道说mybatis对于子查询不会将结果放入缓存中吗,非得之前查询过,子查询才能用缓存。 这是怎么回事,是我的代码写的问题,还是mybatis的bug?
...全文
54 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

476

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧