1.sqlsession.close实际上执行了 conn.close
1.sqlsession.close即会关闭sqlSession,也会执行conn.close
2.如果使用连接池,那么conn.close只代表,将连接归还给连接池,不代表连接关闭
3.如果没有使用连接池,那么sqlSession.close代表执行conn.close代表关闭连接
2.spring整合mybatis,为什么不用手动执行sqlsession.close
1.spring一般生成SqlSessionTemplate用来实现SqlSession接口,它里面有一个sqlSessionProxy
每次sqlSessionTemplate执行操作,都是调用的proxy,进入invoke方法,会根据是否是事务,获取新的sqlSession然后执行真正的目标方法,
最后执行完,调用sqlSession.close,关闭这个获取的sqlSession,而sqlSessionTemplate和其里面的sqlSessionProxy是没有被关闭的,这都是动态代理的体现
2.相当于我们执行完一个 @translation,invoke方法里面 新创建的sqlsession会自动执行close
是通过动态代理方式完成 connection连接的关闭.而且是通过jdk的代理.
3.总结
1.一般我们都使用了连接池技术
2.sqlSession.close实际上执行了,conn.close
3.conn.close要分是否使用连接池技术来看是否关闭连接
4.spring默认不用执行sqlsession.close,它通过动态代理来完成的执行了sqlSession.close