关于mybatis自带的数据源遇到 SQLNonTransientConnectionException异常的解决方法

在实际的开发过程中,我遇到了SQLNonTransientConnectionException异常,这个异常可能的原因有以下几点:

1、由于网络连接断开导致的。"Broken pipe"错误通常在客户端和服务器之间的网络连接不稳定时发生。

2、如果客户端与服务器之间的通信存在较长的时间间隔,可能会导致超时。您可以尝试增加超时设置来延长通信时间,以避免连接断开。

3、服务器负载过高:如果服务器负载过高,可能会导致连接断开。您可以检查服务器的负载情况并采取相应的措施来缓解负载压力,例如增加服务器资源、优化查询等。

4、数据库连接池配置:如果您使用了数据库连接池,确保连接池的配置合理,包括最大连接数、最小空闲连接数等参数的设置。

5、数据库配置:检查数据库服务器的配置,确保数据库的最大连接数等参数设置正确。

6、客户端代码问题:检查客户端代码是否存在问题,例如未正确释放连接、未正确处理异常等。

而我在遇到这个问题时,由于我底层的代码使用的是mybatis 自带的数据源,也就是以下代码

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
    <dataSource type="POOLED">
      <property name="driver" value="${driver}"/>
      <property name="url" value="${url}"/>
      <property name="username" value="${username}"/>
      <property name="password" value="${password}"/>
    </dataSource>
  </environment>
</environments>

这里解释一下,mybatis自带的数据源dataSource属性的type设置为POOLED时,这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。

首先我解决这个异常时,排除了数据源的问题,去查询了是不是mysql自带的缓存关闭了,经过查询之后发现与mysql的缓存没有关系,于是我将mybatis自带的数据源更换成了阿里巴巴研发的德鲁伊连接池,成功解决了这个问题,这里附上,异常的截图和mybatis集成德鲁伊连接池的方法

德鲁伊连接池的mybatis-config.xml文件配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <properties resource="jdbc.properties"/>
    <settings>
        <setting name="logImpl" value="SLF4J"/>
        <setting name="cacheEnabled" value="false"/>
    </settings>
    <typeAliases>
        <package name="pojo"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="DataSource.DruidDataSourceFactory">
                <property name="driverClassName" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="mappers"/>
    </mappers>
</configuration>

这里我编写了自己的数据源工厂,也就是用DruidDataSourceFactory继承UnpooledDataSourceFactory类,以下是DruidDataSourceFactory类的编写内容

public class DruidDataSourceFactory extends UnpooledDataSourceFactory {//mybatis提供用于提供自定义数据工厂的扩展
    @Override
    public DataSource getDataSource() {
        try {
            ((DruidDataSource)this.dataSource).init();//获取数据源的时候需要额外进行一次数据初始化
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return this.dataSource;
    }
    //实例化
    public DruidDataSourceFactory() {
        this.dataSource = new DruidDataSource();
    }
}

当我更换好数据源之后,就成功解决了SQLNonTransientConnectionException异常的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值