开发者社区> 问答> 正文

Java使用aibaba Druid连接池 短时间内就断开连接?报错

 

jdk8 \ mysql 5.7 \ alibaba druid 1.1.4 \ springBoot 1.5.4.RELEASE

项目环境 :使用率很低的项目 大约只有不到十个接口 操作数据库的间隔最长在12个小时以上 

项目启动连接没有任何问题  有时会在20分钟-30分钟之后就报错com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.

再次尝试就会报 org.springframework.dao.DataAccessResourceFailureException

我查过网上的办法

1.设置数据库wait_timeout

    我查了数据库wait_timeout = 86400

2.autoReconnect=true,设置数据库在遇到异常中断的情况下重新连接。

我的URL:

dbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&pinGlobalTxToPhysicalConnection=true

3.项目设置 

validationQuery: SELECT 1

testWhileIdle: true

timeBetweenEvictionRunsMillis: 28000

我的配置

datasource:
   # 初始化大小,最小,最大
    initialSize: 10 #初始化时建立物理连接的个数
    minIdle: 1 #最小连接池数量
    maxActive: 300 #最大连接池数量git
    maxWait: 30000 #获取连接时最大等待时间,单位毫秒。
    timeBetweenEvictionRunsMillis: 10000 #有两个含义: 1) Destroy线程会检测连接的间隔时间 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
    validationQuery: SELECT 1
    testWhileIdle: true #建议配置为true,不影响性能,并且保证安全性。
    testOnBorrow: true #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
    testOnReturn: false #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
    poolPreparedStatements: false #是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。
    maxPoolPreparedStatementPerConnectionSize: 20
    driverClassName: com.mysql.jdbc.Driver
我的代码
@Bean
public XADataSource druidDataSource(){
    return druidDataSource(dbUrl,username,password);
}

public XADataSource druidDataSource(String url, String userName, String password){
    DruidXADataSource datasource = new DruidXADataSource();
    datasource.setUrl(url);
    datasource.setUsername(userName);
    datasource.setPassword(password);
    datasource.setDriverClassName(driverClassName);
    //configuration
    datasource.setInitialSize(initialSize);
    datasource.setMinIdle(minIdle);
    datasource.setMaxActive(maxActive);
    datasource.setMaxWait(maxWait);
    datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
    datasource.setValidationQuery(validationQuery);
    datasource.setTestWhileIdle(testWhileIdle);
    datasource.setTestOnBorrow(testOnBorrow);
    datasource.setTestOnReturn(testOnReturn);
    datasource.setPoolPreparedStatements(poolPreparedStatements);
    datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
    datasource.setConnectionProperties(connectionProperties);
    datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);
    try {
        datasource.setFilters(filters);
    } catch (SQLException e) {
        logger.error("druid configuration initialization filter", e);
    }
    return datasource;
}

感觉并没有什么配置错误 希望看到的大神帮忙讲解一下

展开
收起
爱吃鱼的程序员 2020-06-06 10:03:25 1728 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <p>keepAlive=true</p>
                    
    
                            你好 我配置了您说的那个 然后发现30分钟之后还是会有这种问题
    
                        
    
                            回复 <a class="referer" target="_blank">@mlovewt</a>  : 哦哦 理解了  我还有个问题就是 对于这种使用率低的项目 连接池的minIdle 、maxActive、maxWait、timeBetweenEvictionRunsMillis 这几个参数设置多大比较合适
                        
    
                            回复 <a class="referer" target="_blank">@事儿爹</a>  : 不设置这个不保证连接池中的连接是活的,这是后来的版本添加的参数
                        
    
                            好的 我试一下 能麻烦讲一下为什么会有这种问题吗 
                        
    
                        <p>在我的配置里面加了一个</p> 
    
    keepAlive: true

    然后30分钟之后还是有这种问题

    2020-06-06 10:03:43
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载