diff --git a/src/main/java/com/alibaba/druid/pool/PoolableStatement.java b/src/main/java/com/alibaba/druid/pool/PoolableStatement.java index 60f0f4d956..5de54918d2 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableStatement.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableStatement.java @@ -16,6 +16,7 @@ package com.alibaba.druid.pool; import java.sql.Connection; +import java.sql.Driver; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLWarning; @@ -419,6 +420,25 @@ public class PoolableStatement extends PoolableWrapper implements Statement { return true; } + Driver driver = null; + { + ConnectionHolder holder = conn.getConnectionHolder(); + if (holder != null) { + DruidAbstractDataSource dataSource = holder.getDataSource(); + if (dataSource != null) { + driver = dataSource.getDriver(); + } + } + } + // Oracle Driver 10.x is JDBC 3.0 + if (driver != null) { + if ("oracle.jdbc.driver.OracleDriver".equals(driver.getClass().getName())) { + if (driver.getMajorVersion() <= 10) { + return closed; + } + } + } + try { return stmt.isClosed(); } catch (Throwable t) { diff --git a/src/test/java/com/alibaba/druid/pool/benckmark/Oracle_Case3.java b/src/test/java/com/alibaba/druid/pool/benckmark/Oracle_Case3.java index be61ef843b..68b03ead8b 100644 --- a/src/test/java/com/alibaba/druid/pool/benckmark/Oracle_Case3.java +++ b/src/test/java/com/alibaba/druid/pool/benckmark/Oracle_Case3.java @@ -11,6 +11,7 @@ import javax.sql.DataSource; import junit.framework.TestCase; import org.apache.commons.dbcp.BasicDataSource; +import org.springframework.util.Assert; import com.alibaba.druid.TestUtil; import com.alibaba.druid.pool.DruidDataSource; @@ -96,7 +97,9 @@ public class Oracle_Case3 extends TestCase { ResultSet rs = stmt.executeQuery("SELECT 1 FROM DUAL"); rs.next(); rs.close(); + Assert.isTrue(!stmt.isClosed()); stmt.close(); + Assert.isTrue(stmt.isClosed()); conn.close(); } } catch (Exception ex) {