JAVA检测数据库链接时超时的处理套路

307 阅读1分钟

不用修改数据库创建链接超时配置

public static Connection getConn(DatasourcesDto datasource){
        CodeGenUtils codeGen =new CodeGenUtils();
        // 获取链接超时处理
        ExecutorService executor = Executors.newFixedThreadPool(1);
        Connection conn = null;

        try {
            SimpleTimeLimiter stl = SimpleTimeLimiter.create(executor);

            conn = stl.callUninterruptiblyWithTimeout(new Callable<Connection>() {
                @Override
                public Connection call() throws Exception {
                    return codeGen.getDataSourceConfig(datasource).getConn();
                }
            }, 500, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            Assert.isTrue(DataValiEnum.DB_CONNECT_TIMEOUT, false);
        } finally {
            executor.shutdown();
        }

        return conn;
    }
    
    
private DataSourceConfig getDataSourceConfig(DatasourcesDto datasource) {
        DataSourceConfig dsc = new DataSourceConfig();
        String url = null;
        String driverName = null;
        if(datasource.getDbType() ==  1){ // mysql
            driverName = "com.mysql.cj.jdbc.Driver";
            url = String.format("jdbc:mysql://%s:%d/%s?useUnicode=true&characterEncoding=UTF-8&connectTimeout=500", datasource.getDbHost(),datasource.getPort(),datasource.getDbCode());
        } else if (datasource.getDbType() ==  2){ // oracle
            driverName = "oracle.jdbc.driver.OracleDriver";
            url = String.format("jdbc:oracle:thin:@%s:%d/%s", datasource.getDbHost(),datasource.getPort(),datasource.getDbCode());
        }

        dsc.setUrl(url);

        dsc.setDriverName(driverName);
        dsc.setUsername(datasource.getUsername());
        dsc.setPassword(datasource.getPassword());
        return dsc;
    }