@ -17,7 +17,6 @@
package org.apache.dolphinscheduler.plugin.datasource.api.client ;
import org.apache.dolphinscheduler.plugin.datasource.api.provider.JDBCDataSourceProvider ;
import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam ;
import org.apache.dolphinscheduler.spi.datasource.DataSourceClient ;
import org.apache.dolphinscheduler.spi.enums.DbType ;
@ -25,15 +24,13 @@ import org.apache.dolphinscheduler.spi.enums.DbType;
import org.apache.commons.lang3.StringUtils ;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.util.concurrent.TimeUnit ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.jdbc.core.JdbcTemplate ;
import com.google.common.base.Stopwatch ;
import com.zaxxer.hikari.HikariDataSource ;
@Slf4j
public class CommonDataSourceClient implements DataSourceClient {
@ -42,8 +39,7 @@ public class CommonDataSourceClient implements DataSourceClient {
public static final String COMMON_VALIDATION_QUERY = "select 1" ;
protected final BaseConnectionParam baseConnectionParam ;
protected HikariDataSource dataSource ;
protected JdbcTemplate jdbcTemplate ;
protected Connection connection ;
public CommonDataSourceClient ( BaseConnectionParam baseConnectionParam , DbType dbType ) {
this . baseConnectionParam = baseConnectionParam ;
@ -63,8 +59,7 @@ public class CommonDataSourceClient implements DataSourceClient {
}
protected void initClient ( BaseConnectionParam baseConnectionParam , DbType dbType ) {
this . dataSource = JDBCDataSourceProvider . createJdbcDataSource ( baseConnectionParam , dbType ) ;
this . jdbcTemplate = new JdbcTemplate ( dataSource ) ;
this . connection = buildConn ( baseConnectionParam ) ;
}
protected void checkUser ( BaseConnectionParam baseConnectionParam ) {
@ -73,6 +68,20 @@ public class CommonDataSourceClient implements DataSourceClient {
}
}
private Connection buildConn ( BaseConnectionParam baseConnectionParam ) {
Connection conn = null ;
try {
Class . forName ( baseConnectionParam . getDriverClassName ( ) ) ;
conn = DriverManager . getConnection ( baseConnectionParam . getJdbcUrl ( ) , baseConnectionParam . getUser ( ) ,
baseConnectionParam . getPassword ( ) ) ;
} catch ( ClassNotFoundException e ) {
throw new RuntimeException ( "Driver load fail" , e ) ;
} catch ( SQLException e ) {
throw new RuntimeException ( "JDBC connect failed" , e ) ;
}
return conn ;
}
protected void setDefaultUsername ( BaseConnectionParam baseConnectionParam ) {
baseConnectionParam . setUser ( COMMON_USER ) ;
}
@ -92,7 +101,7 @@ public class CommonDataSourceClient implements DataSourceClient {
// Checking data source client
Stopwatch stopwatch = Stopwatch . createStarted ( ) ;
try {
this . jdbcTemplate . execute ( this . baseConnectionParam . getValidationQuery ( ) ) ;
this . connection . prepareStatement ( this . baseConnectionParam . getValidationQuery ( ) ) . executeQuery ( ) ;
} catch ( Exception e ) {
throw new RuntimeException ( "JDBC connect failed" , e ) ;
} finally {
@ -104,20 +113,21 @@ public class CommonDataSourceClient implements DataSourceClient {
@Override
public Connection getConnection ( ) {
try {
return this . dataSource . getConnection ( ) ;
return connection . isClosed ( ) ? buildConn ( baseConnectionParam ) : connection ;
} catch ( SQLException e ) {
log . error ( "get druidDataSource Connection fail SQLException: {}" , e . getMessage ( ) , e ) ;
return null ;
throw new RuntimeException ( "get conn is fail" , e ) ;
}
}
@Override
public void close ( ) {
log . info ( "do close dataSource {}." , baseConnectionParam . getDatabase ( ) ) ;
try ( HikariDataSource closedDatasource = dataSource ) {
// only close the resource
log . info ( "do close connection {}." , baseConnectionParam . getDatabase ( ) ) ;
try {
connection . close ( ) ;
} catch ( SQLException e ) {
log . info ( "colse connection fail" ) ;
throw new RuntimeException ( e ) ;
}
this . jdbcTemplate = null ;
}
}