Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GetConnectionTimeoutException解决方案之一 #6349

Open
CHINAJAVABoy opened this issue Feb 12, 2025 · 2 comments
Open

GetConnectionTimeoutException解决方案之一 #6349

CHINAJAVABoy opened this issue Feb 12, 2025 · 2 comments

Comments

@CHINAJAVABoy
Copy link

CHINAJAVABoy commented Feb 12, 2025

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);

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);
    }
@ssq667
Copy link

ssq667 commented Feb 25, 2025

我最近也遇到类似的问题 wating 50000 ,active500 maxActive 5000 ,creating 0 ,

@CHINAJAVABoy
Copy link
Author

我最近也遇到类似的问题 wating 50000 ,active500 maxActive 5000 ,creating 0 ,
不是同一个问题,你这个是连接数不够了,500个都不够很可能是出现了连接泄漏

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants