在实际的开发过程中,我遇到了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异常的问题