diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java index 7fb67bbf46..25be6d6dbb 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java @@ -998,6 +998,10 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement return (T) stmt; } + if (iface == PreparedStatementHolder.class) { + return (T) this.holder; + } + return super.unwrap(iface); } } diff --git a/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java b/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java index e826aecaf3..655e1c793f 100644 --- a/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java +++ b/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java @@ -58,6 +58,7 @@ public class PreparedStatementPool { return null; } + holder.incrementHitCount(); dataSource.incrementCachedPreparedStatementHitCount(); if (holder.isEnterOracleImplicitCache()) { OracleUtils.exitImplicitCacheToActive(holder.getStatement()); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestOraclePrefetch.java b/src/test/java/com/alibaba/druid/bvt/pool/TestOraclePrefetch.java index 43c8b7e3d1..f3a1715e0d 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TestOraclePrefetch.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestOraclePrefetch.java @@ -10,6 +10,7 @@ import oracle.jdbc.OracleConnection; import oracle.jdbc.internal.OraclePreparedStatement; import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.PreparedStatementHolder; import com.alibaba.druid.test.util.OracleMockDriver; import com.alibaba.druid.util.JdbcUtils; @@ -34,20 +35,25 @@ public class TestOraclePrefetch extends TestCase { String sql = "SELECT 1"; + OracleConnection oracleConn; + OraclePreparedStatement oracleStmt; + PreparedStatementHolder stmtHolder; { Connection conn = dataSource.getConnection(); { - OracleConnection oracleConn = conn.unwrap(OracleConnection.class); + oracleConn = conn.unwrap(OracleConnection.class); Assert.assertEquals(50, oracleConn.getDefaultRowPrefetch()); } PreparedStatement stmt = conn.prepareStatement(sql); - { - OraclePreparedStatement oracleStmt = stmt.unwrap(OraclePreparedStatement.class); - Assert.assertEquals(50, oracleStmt.getRowPrefetch()); - } + oracleStmt = stmt.unwrap(OraclePreparedStatement.class); + Assert.assertEquals(50, oracleStmt.getRowPrefetch()); + + stmtHolder = stmt.unwrap(PreparedStatementHolder.class); + Assert.assertNotNull(stmtHolder); + Assert.assertEquals(0, stmtHolder.getHitCount()); ResultSet rs = stmt.executeQuery(); rs.next(); @@ -61,22 +67,29 @@ public class TestOraclePrefetch extends TestCase { Connection conn = dataSource.getConnection(); { - OracleConnection oracleConn = conn.unwrap(OracleConnection.class); - Assert.assertEquals(50, oracleConn.getDefaultRowPrefetch()); + OracleConnection oracleConn2 = conn.unwrap(OracleConnection.class); + Assert.assertEquals(50, oracleConn2.getDefaultRowPrefetch()); + Assert.assertSame(oracleConn, oracleConn2); } PreparedStatement stmt = conn.prepareStatement(sql); + + { + PreparedStatementHolder stmtHolder2 = stmt.unwrap(PreparedStatementHolder.class); + Assert.assertSame(stmtHolder2, stmtHolder); + Assert.assertEquals(1, stmtHolder.getHitCount()); + } ResultSet rs = stmt.executeQuery(); rs.next(); - + rs.close(); + stmt.close(); { - OraclePreparedStatement oracleStmt = stmt.unwrap(OraclePreparedStatement.class); + OraclePreparedStatement oracleStmt2 = stmt.unwrap(OraclePreparedStatement.class); + Assert.assertSame(oracleStmt, oracleStmt2); Assert.assertEquals(2, oracleStmt.getRowPrefetch()); } - rs.close(); - stmt.close(); conn.close(); }