解决Druid动态数据源配置重复刷错误日志的问题
作者:小妖云汐 发布时间:2021-06-06 17:44:51
Druid动态数据源配置 主要是继承AbstractRoutingDataSource再通过AOP来实现动态数据源切换.
下面给大家介绍Druid动态配置数据源重复刷错误日志问题,具体内容如下所示:
问题描述
功能需求:
使用druid数据库连接池实现 动态的配置数据源功能:IP、端口、用户名、密码都是用户页面手动输入,可以测试连接,保存数据源。
问题说明:
既然是用户自己配置的数据源,就无法避免输入错误,连接失败等情况。
预期情况:用户输入的配置错误,测试连接时,会返回连接失败的信息。
实际情况:数据源测试连接,连接失败后:
后台一直打印错误信息,一直自动重连
方法被阻塞无返回信息,导致前端页面一直处于等待状态
【错误信息】:
com.alibaba.druid.pool.DruidDataSource-create connection SQLException, url:xxx, errorCode 0, state 08S01
The last packet sent successfully to the server was 0 milliseconds ago.
The driver has not received any packets from the server.
【原始代码】:
public static void getDataSource(DataConfig dataConfig) throws Exception{
try {
Properties properties = new Properties();
properties.setProperty("driverClassName",dataConfig.getDriverClassName());
properties.setProperty("url",dataConfig.getUrl());
properties.setProperty("username",dataConfig.getUserName());
properties.setProperty("password",dataConfig.getPassWord());
DataSource ds = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
解决办法
【参数说明】
参数 | 解释 |
---|---|
connectionErrorRetryAttempts | 连接出错后再尝试连接次数 |
breakAfterAcquireFailure | 数据库服务宕机自动重连机制 |
maxWait | 超时等待时间 |
【
修改后的代码】
public static void getDataSource(DataConfig dataConfig) throws Exception{
try {
Properties properties = new Properties();
properties.setProperty("driverClassName",dataConfig.getDriverClassName());
properties.setProperty("url",dataConfig.getUrl());
properties.setProperty("username",dataConfig.getUserName());
properties.setProperty("password",dataConfig.getPassWord());
properties.setProperty("maxWait","500");//如果失败,当前的请求可以返回
DruidDataSource druidDataSource = (DruidDataSource)DruidDataSourceFactory.createDataSource(properties);
druidDataSource.setConnectionErrorRetryAttempts(0);// 失败后重连的次数
druidDataSource.setBreakAfterAcquireFailure(true);//请求失败之后中断
DataSource ds = druidDataSource;//如果有需要使用javax.sql.DataSource的话
} catch (Exception e) {
e.printStackTrace();
}
}
踩坑总结
不要在properties中配置connectionErrorRetryAttempts和breakAfterAcquireFailure,没有效果
连接失败的具体错误信息,catch不到,源码中已经catch了异常信息,做了相关处理
来源:https://blog.csdn.net/qq_42002006/article/details/115935976
猜你喜欢
- 之前代码有一个逻辑,是在初始化时读取某个包下的所有class文件,放入到一个HashMap里。代码运行过程中,通过Key获取到对应class
- ThreadLocal是什么?该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过
- ExpandableListView介绍 ExpandableListView的引入 ExpandableListVie
- 下面是20个非常有用的Java程序片段,希望能对你有用。1. 字符串有整型的相互转换String a = String.valueOf(2)
- Spring AOP预处理Controller的参数实际编程中,可能会有这样一种情况,前台传过来的参数,我们需要一定的处理才能使用比如有这样
- 本文实例讲述了Android中Bitmap用法。分享给大家供大家参考,具体如下:一般在android程序中把图片文件放在res/drawab
- Java以命令模式设计模式1、简单介绍意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。主要解决:在软件系统中,行为
- 本文实例讲述了C#反射应用。分享给大家供大家参考。具体如下:通过反射实现多系统数据库的配置通过定义接口,反射实例化配置的节点的值配置App.
- session超时退到登录页面最近发现使用的工程居然没有session超时机制,功能太欠缺了,现在把追加方法分享出来,里面有一些坑,大家自由
- 概述什么是动态编程?动态编程解决什么问题?Java中如何使用?什么原理?如何改进?(需要我们一起探索,由于自己也是比较菜,一般深入不到这个程
- 目录批量更新同一张表的数据更新多条数据,每条数据都不一样java中for循环实现方式一条SQL,服务端逐条更新mybatis实现方式使用Fl
- 背景:今天新生成一个springboot项目,然而启动日志,还有mybatis的详细日志无法打印出来,自写程序中打印的日志可以输出;网上找了
- 前言此文章主要解决拦截用户点击手机底部导航栏中的返回键时该事件的拦截;此方法依然可以适用于fragmentonBackPressed()这是
- FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化
- 本文为大家分享了经典24点纸牌益智游戏的具体实现方法,供大家参考,具体内容如下一.实验内容24点游戏是经典的纸牌益智游戏。常见游戏规则:从扑
- 在nginx.conf文件的http模块新增以下内容gzip &nbs
- springboot上传文件大小的配置我这里记录两种,一种是设置在配置文件里只有两行代码,一种是加个Bean首先第一种:applicatio
- 平时写项目的时候,java之父叫我们多打日志,我们通常使用traceId和requestId来保存完整请求的链路日志,例如市面上的skywa
- Java 实现汉字转换为拼音转换类public class PINYINChinese { private static int
- Java有四种访问权限,其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符:1.&nb