千家信息网

为何一定要关闭mybatis中的SqlSession

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,为何一定要关闭mybatis中的SqlSession,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。mybatis的Sql
千家信息网最后更新 2026年11月02日为何一定要关闭mybatis中的SqlSession

为何一定要关闭mybatis中的SqlSession,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

mybatis的SqlSession一定要关闭

今天在使用mybatis查询数据时,出现了一个很奇怪的问题。同一条sql语句,查询时快时慢,并且有一定的规律性,大概每10次查询中有一次会特别特别的慢,快的只需要1ms,慢的要20000ms,sql代码及快慢时间截图如下:

select fknr from jq_fkqk where jjxh = ?

快的情况

慢的情况

通过日志打印mybatis查询信息时,我观察到特别慢的时候,并不是因为它查询很慢,而是因为它需要等待一段很长的时间才开始:

==> Preparing: select fknr from jq_fkqk where jjxh = ?

说明时间长就出现在这里,这个等待的时间。

为什么会要等待这么久呢?我自然而然的看了一下上一次查询的函数,发现在函数里面没有session.close(),把这一句加上,问题就解决了,速度就飞快了。

我本来想查看官方文档,查看原因,但是没找到,只能结合我自己的理解来分析一下。SqlSession是通过SqlSessionFactory来构造的,相当于维护一个连接池,当我们不停的进行查询的时候,由于没有关闭连接,导致与数据库的连接数量达到了一个上限(可能连接池有最大连接数,但是我们有找到文档)。

到达上限之后,再次请求查询时,Factory说没有连接了,让你先等一下,它先去判断哪些SqlSession已经没有人使用了(类似于垃圾回收机制),然后调用相应的进程去自动关闭没用的session连接,注意调用进程可是要排队的,也要耗时间。

等关闭了没有用的session之后,Factory通知你,有空闲的session了,开始准备你的查询吧,所有才会有等待很长一段时间才出现:

==> Preparing: select fknr from jq_fkqk where jjxh = ?

这纯属我自己的理解,但是重点还是表达出来了,就是Mybatis中的session一定要手动去关闭它,session.close(),不然会占着资源,导致性能下降!!!

mybatis中SqlSession使用事项

一.SqlSession的使用范围

SqlSession中存储的是编译好的sql语句,这些sql语句是mybatis配置文件读取mapper.xml文件生成的,将sql语句存储到SqlSessionFactory和SqlSession中。封装了对数据库的操作,如:查询、插入、更新、删除等。

通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder加载配置文件进行创建。在开发中SqlSession在每次使用完都要进行关闭,使用时创建,也就是多例的,线程安全。SqlSessionFactory在整个类中只有一个对象,也就是单例的,单例的线程不安全。

二.SqlSessionFactoryBuilder

SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。

三.SqlSessionFactory

SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。

四.SqlSession

SqlSession是一个面向用户的接口, sqlSession中定义了数据库操作,默认使用DefaultSqlSession实现类。

执行过程如下:

1、加载数据源等配置信息

Environment environment = configuration.getEnvironment();

2、创建数据库链接

3、创建事务对象

4、创建Executor,SqlSession所有操作都是通过Executor完成,mybatis源码如下:

if (ExecutorType.BATCH == executorType) {      executor = newBatchExecutor(this, transaction);    } elseif (ExecutorType.REUSE == executorType) {      executor = new ReuseExecutor(this, transaction);    } else {      executor = new SimpleExecutor(this, transaction);    }if (cacheEnabled) {      executor = new CachingExecutor(executor, autoCommit);    }

SqlSession的实现类即DefaultSqlSession,此对象中对操作数据库实质上用的是Executor

每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。

打开一个 SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。如下:

SqlSession session = sqlSessionFactory.openSession();    try {          // do work    } finally {          session.close();    }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

查询 数据 范围 数据库 时间 实例 方法 线程 语句 安全 对象 接口 文件 配置 上限 也就是 信息 函数 字段 情况 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司简介 亿人帮互联网科技有限公司 互联网佳科技有限公司 互联网科技股票 北京互联网络科技有限公司 奇士达互联网科技 互联网科技产品 字节跳动和互联网科技 互联网科技教育视频 世界互联网科技公司市值排名 注册互联网科技公司经营范围大全 洛阳昕诺飞互联网科技有限公司 广州互联网高科技取餐柜 云鲸互联网络科技有限公司 国产互联网科技公司 科技互联网公司两年变化 第三届互联网大会安防黑科技 互联网科技大佬云集 承德科技产业互联网平台 安徽九吞吴互联网科技有限公司 互联网络科技 深圳市人人互联网科技有限公司 互联网科技公司税收优惠 互联网和高科技公司 互联网对科技的发展 苏州铭阳互联网科技有限公司 皮皮虾互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 长沙渺峰互联网科技有限公司 互联网大会出现的黑科技
0