请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于sqlsession的重建问题

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

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

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


正在回答

1回答

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

因为我们是集成到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 回复 有任何疑惑可以回复我~
  • 提问者 CrimsonTree #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-01-10 19:31:03
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号