DruidPlugin的参数配置问题

一个租户系统中配置了很多租户的数据库连接信息,运行一段时间后,当某个租户更改了数据库ip,而在我们租户系统中未更新,就会抛出异常,关键是隔不了多久会导致整个程序卡死。


网上搜索了下需要配置Druid的setMaxWait、setConnectTimeout参数,但DruidPlugin中没有看到setConnectTimeout这个参数。请教下如何正确设置Druid参数避免这种问题出现?


2025-04-18 19:50:33
[ERROR]-[Thread: Druid-ConnectionPool-Create-1667124391]-[com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run()]: create connection SQLException, url: jdbc:sqlserver://xxx.xxx.xxx.x:xx;DatabaseName=XXX, errorCode 0, state 08S01
com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 xxx 连接到主机 xxx.xxx.xxx.x 的 TCP/IP 连接失败。错误:“connect timed out。请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接,还要确保防火墙没有阻止到此端口的 TCP 连接。”。
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1033)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:817)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:700)
	at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:842)
	at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1682)
	at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1803)
	at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2914)


评论区

杜福忠

2025-04-19 16:26

你可能是需要setTimeBetweenConnectErrorMillis 这个方法(配置发生错误时多久重连)。

PS:如果需要的 set 方法DruidPlugin没有实现时,可以自行调用DruidDataSource ds 对象。
示例代码:
DruidPlugin dp = new DruidPlugin(url, name, pwd){
@Override
public boolean start() {
if (super.start()){
this.ds.setConnectionErrorRetryAttempts(10);//控制连接失败重试次数
this.ds.setBreakAfterAcquireFailure(true);//失败后终止重试
this.ds.setMaxWait(1000 * 10);//10秒超时
}
return true;
}
};

补充:
还可以DruidPlugin addFilter加监控 累计错误次数,然后做相应的处理,比如关闭DruidPlugin,通知负责人之类的业务。

或者增加自定义任务器,定期检查数据库的健康情况,长期不访问的租户做关闭连接池操作,下次访问时再启动即可(如果配置不对自然也启动不了)

liugz

2025-04-19 17:26

@杜福忠 感谢。看了jfianl源码可以调用getDruidDataSource()方法进行设置。
先这么设置下,看是不是这个问题导致。每个月总有几个客户数据库出问题,然后就导致租户系统卡死。

杜福忠

2025-04-19 17:51

@liugz 注意 getDruidDataSource() 需要在 start 之后,之前还没创建对象

热门反馈

扫码入社