关于sqlsession的重建问题

来源:7-4 分类管理模块所有功能自测

CrimsonTree

2018-01-07

geely老师,在测试递归查询所有的categoryid功能时,我看到日志中有生成多个

“Creating a new SqlSession”这样的语句,我想了解下,这样是否会很费系统资源?

是否有办法重用一个sqlsession并查询多次?  这个问题在实际项目开发过程中是否需要考虑?


写回答

1回答

Geely

2018-01-09

你好,同学,非常赞的一个问题,首先赞一下同学的思考。

因为我们是集成到spring里,session托管给spring来处理。也就是mybatis-spring这个包做的桥接。


实际上因为我们的dao继承了SqlSessionDaoSupport,而SqlSessionDaoSupport内部sqlSession的实现是使用用动态代理实现的,这个动态代理sqlSessionProxy使用一个模板方法封装了sql语句如select()等操作,每一次select()查询都会自动先执行openSession(),执行完close()以后调用close()方法,相当于生成了一个新的session实例,所以我们无需手动的去关闭这个session()(关于这一点见下面mybatis的官方文档),当然也无法使用mybatis的一级缓存,也就是说mybatis的一级缓存在spring中是没有作用的.

官方文档摘要

MyBatis SqlSession provides you with specific methods to handle transactions programmatically. But when using MyBatis-Spring your beans will be injected with a Spring managed SqlSession or a Spring managed mapper. That means that Spring will always handle your transactions.

You cannot call SqlSession.commit(), SqlSession.rollback() or SqlSession.close() over a Spring managed SqlSession. If you try to do so, a UnsupportedOperationException exception will be thrown. Note these methods are not exposed in injected mapper classes.

 



这个问题不用纠结,微乎其微。如果不要托管,就需要我们手动处理opensession  closesession等。




0
1
CrimsonTree
非常感谢!
2018-01-10
共1条回复

从0开始 独立完成企业级Java电商网站服务端开发

前后端分离,数据库接口设计,架构设计,功能开发,上线运维

9505 学习 · 8820 问题

查看课程