mybaits连接不释放

项目为单体项目(spring+springmvc+mybatis)mybatis框架执行插入的语句,连接总是不释放,数据库是sqlserver,数据库连接池是c3p0
调用代码如下:

img

img

img


包引用如下

img

img

img

img

img


sqlserver监控未释放语句

img

连接池配置发一下

其它方法在finally块中都存在调用closeSqlSession方法
closeSqlSession(sqlSession);

该回答引用ChatGPT
从您提供的代码和描述来看,可能存在以下两个问题:

1.连接未关闭

在您的代码中,虽然使用了try-with-resources语句块,但是没有关闭连接。正确的用法应该是在代码结尾处加上con.close()语句,释放连接。

2.事务未提交或回滚

在您的代码中,虽然开启了事务,但是没有提交或回滚。如果发生异常,事务也不会自动回滚。您应该在catch语句块中调用con.rollback()回滚事务,或者在finally语句块中调用con.commit()提交事务。

修改后的代码如下:

Java
public Integer insertTest(User user) {
Connection con = null;
try {
con = dataSource.getConnection();
con.setAutoCommit(false); //开启事务
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Integer id = userMapper.insert(user);
con.commit(); //提交事务
return id;
} catch (Exception e) {
try {
con.rollback(); //回滚事务
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
return null;
} finally {
try {
if (con != null) {
con.close(); //关闭连接
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}


希望能对您有所帮助。

连接池的作用就是复用链接,它不会将链接关闭,而是将链接放回连接池,以备下次使用

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
数据库连接不释放可能会导致严重的性能问题和资源浪费,建议按照下面的步骤进行诊断和解决问题:

  1. 确认使用的数据库连接池是否正确配置。你可以尝试调整连接池的最大连接数以及连接超时时间等参数,看看是否能解决问题。

  2. 确认是否正确关闭数据库连接。在每个数据库连接使用完毕后,一定要将其显式关闭,以便连接池能够重复使用。你可以添加一些日志,查看连接是否被正确关闭。

  3. 检查代码中是否存在连接泄漏。比如,如果在方法中使用了try-catch语句,那么需要在finally块中关闭连接。同时,你可以使用一些工具来检测连接泄漏,如Druid连接池提供的监控插件。

在你提供的代码中,我没有看到具体的连接关闭操作。你可以尝试在Mapper.xml中使用sqlSession的insert方法,它会自动管理连接的开启和关闭。示例代码如下:

<insert id="insertUser" parameterType="com.example.User">
    insert into user(username,password) values(
    #{username},#{password})
</insert>

如果你仍然无法解决问题,可以使用jstack或者VisualVM等工具来分析Java进程的堆栈信息,查看是否存在连接泄漏的线程。
如果我的回答解决了您的问题,请采纳!

以下内容部分参考ChatGPT模型:
首先,根据提问者提供的代码和配置信息,问题可能出在以下几个方面:

  1. 数据库连接池的配置问题
  2. Mybatis会话工厂的配置问题
  3. Mybatis的事务管理配置问题
  4. 数据库连接未及时释放

针对这些可能的问题,可以采取以下一些解决方案:

  1. 数据库连接池的配置问题

首先,可以尝试检查c3p0数据库连接池的配置是否正确。可以检查以下几个方面:

  • c3p0配置文件是否正确,例如maxPoolSize、minPoolSize、maxIdleTime等参数是否设置合理;
  • 数据库连接池是否存在连接泄漏,即连接未及时释放导致连接池中连接数过多。

可以通过设置连接池监控参数,例如acquireRetryAttempts、acquireRetryDelay等参数,来判断连接池是否出现连接泄漏问题。

  1. Mybatis会话工厂的配置问题

其次,可以检查Mybatis会话工厂的配置是否正确。可以检查以下几个方面:

  • Mybatis配置文件是否正确,例如typeAliases、mappers等参数是否设置正确;
  • Mybatis会话工厂是否正确关闭,即是否调用了close方法。

可以在代码中加入try-finally语句,在finally中调用session.close()方法,来确保会话工厂正确关闭。

  1. Mybatis的事务管理配置问题

如果代码中涉及到事务操作,那么可以检查Mybatis的事务管理配置是否正确。可以检查以下几个方面:

可以在代码中加入try-catch语句,在catch中回滚事务,来确保事务正确回滚。

  1. 数据库连接未及时释放

最后,如果以上三个方面都没有问题,那么问题可能出在数据库连接未及时释放。可以在代码中加入try-finally语句,在finally中调用conn.close()方法,来确保数据库连接正确释放。

代码示例:

public void insertUser(User user) {
    SqlSession session = sqlSessionFactory.openSession();
    Connection conn = session.getConnection();
    try {
        UserMapper mapper = session.getMapper(UserMapper.class);
        mapper.insertUser(user);
        session.commit();
    } catch (Exception e) {
        session.rollback();
    } finally {
        session.close();
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

通过以上的方案,可以尝试解决Mybatis连接不释放的问题。
如果我的建议对您有帮助、请点击采纳、祝您生活愉快

应该是该条sql语句造成数据库死锁了,根据pid将该进程杀掉重新执行下试试

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/266512
  • 除此之外, 这篇博客: 【mybatis】【Spring】【SpringMVC】吐血整理中的 mybatis动态sql有什么用?执行原理?有哪些动态sql 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    Mybatis 动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql,执行原理是根据表达式的值 完成逻辑判断并动态拼接 sql 的功能。

    Mybatis 提供了 9 种动态 sql 标签:trim | where | set | foreach | if | choose| when | otherwise | bind。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^该回答引用ChatGPT
根据您提交的问题,我看到您遇到了MyBatis连接不释放的问题。一般来讲,这个问题很可能是由于未正确关闭连接导致的。您的代码中似乎确实没有调用close()方法关闭连接,所以这可能是造成连接未释放的原因。

建议您在每次执行完MyBatis MyBatis的操作后,都执行close()方法关闭连接。或者使用try-with-resources语法,以确保资源正确关闭。修改后的代码示例:


public void addEmployee(Employee employee) {
SqlSession session = null;
try{
session = sqlSessionFactory.openSession();
EmployeeDAO employeeDAO = session.getMapper(EmployeeDAO.class);
employeeDAO.addEmployee(employee);
session.commit();
}catch (Exception ex){
ex.printStackTrace();
session.rollback();
}finally{
if(session != null){
session.close();
}
}
}


另外,建议您在c3p0的配置文件中设置连接超时时间,以防止由于连接占用时间过长而造成的连接未释放问题。例如,将配置文件中的maxIdleTime属性设置为一个合理的值,如300秒:





希望我的回答能够帮到您!