@ -27,12 +27,14 @@ import javax.sql.ConnectionEventListener;
import javax.sql.StatementEventListener ;
import java.sql.Connection ;
import java.sql.SQLException ;
import java.sql.SQLFeatureNotSupportedException ;
import java.sql.Statement ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.Date ;
import java.util.HashSet ;
import java.util.List ;
import java.util.Map ;
import java.util.Set ;
import java.util.concurrent.CopyOnWriteArrayList ;
import java.util.concurrent.locks.ReentrantLock ;
@ -41,6 +43,8 @@ import java.util.concurrent.locks.ReentrantLock;
* /
public final class DruidConnectionHolder {
private final static Log LOG = LogFactory . getLog ( DruidConnectionHolder . class ) ;
static Set < DbType > holdabilityUnsupportedDbTypes = new HashSet < > ( Arrays . asList ( DbType . sybase , DbType . db2 , DbType . hive , DbType . odps ) ) ;
public static boolean holdabilityUnsupported = false ;
protected final DruidAbstractDataSource dataSource ;
@ -101,53 +105,46 @@ public final class DruidConnectionHolder {
this . lastActiveTimeMillis = connectTimeMillis ;
this . lastExecTimeMillis = connectTimeMillis ;
this . underlyingAutoCommit = conn . getAutoCommit ( ) ;
if ( conn instanceof WrapperProxy ) {
this . connectionId = ( ( WrapperProxy ) conn ) . getId ( ) ;
} else {
this . connectionId = dataSource . createConnectionId ( ) ;
}
{
boolean initUnderlyHoldability = ! holdabilityUnsupported ;
// 下面是一些驱动的默认值,reset时用到
// autoCommit
this . underlyingAutoCommit = conn . getAutoCommit ( ) ;
// holdability
DbType dbType = DbType . of ( dataSource . dbTypeName ) ;
if ( dbType = = DbType . sybase //
| | dbType = = DbType . db2 //
| | dbType = = DbType . hive //
| | dbType = = DbType . odps //
) {
initUnderlyHoldability = false ;
}
if ( initUnderlyHoldability ) {
boolean initUnderlyingHoldability = ! holdabilityUnsupported ;
if ( holdabilityUnsupportedDbTypes . contains ( dbType ) ) {
initUnderlyingHoldability = false ;
}
if ( initUnderlyingHoldability ) {
try {
this . underlyingHoldability = conn . getHoldability ( ) ;
} catch ( UnsupportedOperationException | AbstractMethodError | SQLFeatureNotSupportedException e ) {
holdabilityUnsupported = true ;
LOG . warn ( "getHoldability unsupported" , e ) ;
} catch ( SQLException e ) {
// bug fixed for hive jdbc-driver
if ( "Method not supported" . equals ( e . getMessage ( ) ) ) {
holdabilityUnsupported = true ;
}
LOG . warn ( "getHoldability error" , e ) ;
} catch ( Throwable e ) {
holdabilityUnsupported = true ;
LOG . warn ( "getHoldability error" , e ) ;
}
}
}
// readOnly
try {
this . underlyingReadOnly = conn . isReadOnly ( ) ;
} catch ( Throwable e ) {
LOG . warn ( "isReadOnly error" , e ) ;
}
// transactionIsolation
try {
this . underlyingTransactionIsolation = conn . getTransactionIsolation ( ) ;
} catch ( SQLException e ) {
// compartible for alibaba corba
if ( "HY000" . equals ( e . getSQLState ( ) )
| | "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException" . equals ( e . getClass ( ) . getName ( ) ) ) {
// skip
} else {
throw e ;
}
} catch ( Throwable e ) {
LOG . warn ( "getTransactionIsolation error" , e ) ;
}
this . defaultHoldability = underlyingHoldability ;