> Druid版本:v1.2.18
最近项目中经常出现:com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 120000, active 0, maxActive 128, creating 0, createErrorCount 2,但是其他平台连接这个数据源正常的
于是做了一个实验复现了这个问题:
1. 先搞一个案例一直拿连接执行
2. 中途关闭数据库模拟网络问题或者数据库服务繁忙的情况 net stop mysql
3. 然后复现了GetConnectionTimeoutException的情况
4. 再开启数据库发现数据库连接没有恢复 net start mysql
解决办法:
//开启这两个配置就能实现断开重连了,如果没生效尝试升级一下版本1.2.16+
druidDataSource.setBreakAfterAcquireFailure(false);
druidDataSource.setKeepAlive(true);
```java
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
pro.setProperty(DruidDataSourceFactory.PROP_DRIVERCLASSNAME, "com.mysql.cj.jdbc.Driver");
pro.setProperty(DruidDataSourceFactory.PROP_URL, "jdbc:mysql://localhost:3306/xxx?useCursorFetch=true");
pro.setProperty(DruidDataSourceFactory.PROP_USERNAME, "root");
pro.setProperty(DruidDataSourceFactory.PROP_PASSWORD, "123456");
pro.setProperty(DruidDataSourceFactory.PROP_MAXWAIT, "120000");
pro.setProperty(DruidDataSourceFactory.PROP_MAXACTIVE, "16");
pro.setProperty(DruidDataSourceFactory.PROP_VALIDATIONQUERY, "select 1");
DruidDataSource druidDataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(pro);
druidDataSource.setConnectionErrorRetryAttempts(0);
druidDataSource.setConnectTimeout(10*1000);
druidDataSource.setSocketTimeout(90*1000);
druidDataSource.setRemoveAbandoned(true);
//开启这两个配置就能实现断开重连了,如果没生效尝试升级一下版本1.2.16+
druidDataSource.setBreakAfterAcquireFailure(false);
druidDataSource.setKeepAlive(true);
druidDataSource.init();
new Thread(() -> {
for (int i = 0; i < 10000; i++) {
try {
DruidPooledConnection connection = druidDataSource.getConnection();
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select * from xxx");
while (resultSet.next()) {
System.out.println(resultSet.getString("id"));
}
resultSet.close();
statement.close();
connection.close();
Thread.sleep(1000);
}catch (Exception e){
log.error("error", e);
}
}
}).start();
Thread.sleep(30000000);
}
```