1.sqlSession和connection的区别

艰深了解:一个sqlSession对应一个connection,sqlSession是用来操作connection的

Connection

作为一个特定数据库的会话,在一个连贯的上下文中,sql语句被执行,而后后果被返回。咱们在一次Connection上下文中能够执行多个操作。然而默认状况下,一个connection被创立时,默认是auto-commit模式,statement执行完sql后主动commit。这样,尽管多个操作在同一个Connection上下文中执行,他们本人只和本人有关系,然而他们之间没有什么关系。如果咱们想多个操作,同时胜利或同时失败,那就要设置禁止auto-commit模式,而后手动commit 。这样一次Connection中的几个操作,就具备同时胜利或者同时失败的关系。

1.注册驱动Class.forName("com.mysql.jdbc.Driver");2.获取数据库连贯Connection conn  =DriverManager.getConnection(url,user,p);3.创立向数据发送sql 的statement对象Statement stmt = conn.CreateStatement();4.向数据库发送sqlResultSet rs  = stmt.executeQuery(sql)//select语句int updateaSum = stmt.executeUpdate(sql)//insert,update delete语句5. 处理结果集while(rs.next()){    rs.getString(列名)    rs.getInt(列名)}6. 敞开资源rs.close();stmt.close();conn.close();

SqlSession

能够看作是对Connection 更加高级的形象,从其办法上更加能够看出他具备更加显著的操作特色。

void select(String statement, ResultHandler handler);  int insert(String statement, Object parameter);  int update(String statement);  int delete(String statement, Object parameter)

2.sqlSession的原理

一个sqlsession个别对应一个connection,并且mybatis默认每次获取session都会开启一个事务,且不主动提交事务。如果更新操作实现后不手动commit,则在连贯断开时会将更新操作回滚,一个sqlSession(一个transaction)中能够屡次commit,commit后cache和statement刷新(个别一个事务(transaction)只对应一个sqlseesion,也即一个connection,分布式一个事务能够对应多个connection),只有close后同时敞开sqlsession和transaction(transaction能够由factory敞开)并返回connection。mybatis的transaction根本没增加什么性能,大部分仅状态判断后交由connection(再由jdbc)执行。可能是为了给spring等框架容易组转本人的事务管理机制

思考

2.1为什么每次都要执行sql完结都会登程sqlSession.close()?同一个线程应用ThreadLocal中只保留一份不好吗?

Connection对象是线程不平安的,为防止多个线程才做同一个connection对象,能够采纳ThreadLocal机制。
sqlSession是对connection的进一步封装。事务存在的状况下,sqlSession会存在复用以确保事务的失常运行和回滚。事务不存在的状况下,sqlSession对象是能够始终应用ThreadLocal中与该线程绑定的同一个connection,然而此种形式并不优雅,mybatis也并没有采纳。理由如下:connection对象能够被看为一种可复用的资源,应用连接池技术更加正当,否则,同一个sqlSession始终持有同一个connection不开释,在不进行DB操作时也占用着该链接,将会很消耗资源,而mybatis是采纳链接池记述,看似“create”,实为复用同一个链接对象。看似“close”,实为开释回链接池,很好的解决啦资源节约,又保障了设计准则

2.2 事务是怎么实现的?事务的流传行为又是怎么的

事务是通过sqlSessionHolder等类实现的,事务实现的根底是事务中的所有长久化操作应用的是同一个connection。故多线程状况下不存在事务的流传行为

参考文献:https://blog.csdn.net/hcy5421...

https://cloud.tencent.com/dev...