一、@Transactional事物——》数据库连接
执行查询SQL的方法也需要添加事物管理,间接管理SQL连接,提升效率。(同一方法中SQL执行数量越多效果越显著)
以下是非事物/事物2种情况的DEBUG日志对比
①查询方法未加spring事物:有多少条sql需要建多少次数据库连接,频繁创建、关闭。此时spring未对连接池进行管理(多次开启连接、关闭连接,spring未管理JDBC连接)
DEBUG - Creating a new SqlSession
DEBUG - SqlSession was not registered for synchronization because synchronization is not active
DEBUG - Closing non transactional SqlSession
DEBUG - JDBC Connection will not be managed by Spring
创建SqlSession
由于同步未处于活动状态,因此未注册用于同步的SqlSession
关闭非事务性SqlSession
JDBC连接将不由Spring管理
②查询方法上添加@Transactional:多条sql在一个事物里时只create一次SqlSession,后面直接在事物中提取。此时spring为对连接进行管理
DEBUG - Creating a new SqlSession
DEBUG - Registering transaction synchronization for SqlSession
DEBUG - Fetched SqlSession from current transaction
DEBUG - JDBC Connection will be managed by Spring
创建SqlSession
为SqlSession注册事务同步
从当前事务中提取的SqlSession
JDBC连接将由Spring管理
二、同样的SQL服务启动后初次查询稍慢,后面就会很快。
任何一种语言都有这种情况
因为都要进行编译,解析,
以后快是因为以后的操作利用了前一次操作的结果,
比如SQL生成执行计划,那么以后再执行时会调用这个计划来实现,这样就省去了生成计划的时间,而且往往第一次生成计划要耗费很多时间。