diff --git a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java index caf31bc640..4149b21dd7 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java @@ -303,7 +303,7 @@ public class PoolableConnection implements PooledConnection, Connection { return poolableStatement; } } - + PreparedStatement stmt = conn.prepareStatement(sql, autoGeneratedKeys); holder.getDataSource().initStatement(stmt); @@ -321,72 +321,82 @@ public class PoolableConnection implements PooledConnection, Connection { public CallableStatement prepareCall(String sql) throws SQLException { checkOpen(); - if (holder.isPoolPreparedStatements()) { - PreparedStatementKey key = new PreparedStatementKey(sql, getCatalog(), MethodType.Precall_1); + PreparedStatementKey key = new PreparedStatementKey(sql, getCatalog(), MethodType.Precall_1); + if (holder.isPoolPreparedStatements()) { PoolableCallableStatement poolableStatement = (PoolableCallableStatement) holder.getStatementPool().get(key); if (poolableStatement != null) { poolableStatement.setPoolableConnection(this); + poolableStatement.setClosed(false); + holder.addTrace(poolableStatement); return poolableStatement; } - - CallableStatement stmt = conn.prepareCall(sql); - - holder.getDataSource().initStatement(stmt); - - return new PoolableCallableStatement(this, stmt, key); } - return conn.prepareCall(sql); + CallableStatement stmt = conn.prepareCall(sql); + + holder.getDataSource().initStatement(stmt); + + CallableStatement rtnVal = new PoolableCallableStatement(this, stmt, key); + + holder.addTrace(rtnVal); + + return rtnVal; } @Override public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkOpen(); + PreparedStatementKey key = new PreparedStatementKey(sql, getCatalog(), MethodType.Precall_2); if (holder.isPoolPreparedStatements()) { - PreparedStatementKey key = new PreparedStatementKey(sql, getCatalog(), MethodType.Precall_2); - PoolableCallableStatement poolableStatement = (PoolableCallableStatement) holder.getStatementPool().get(key); if (poolableStatement != null) { poolableStatement.setPoolableConnection(this); + poolableStatement.setClosed(false); + holder.addTrace(poolableStatement); return poolableStatement; } - - CallableStatement stmt = conn.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); - - holder.getDataSource().initStatement(stmt); - - return new PoolableCallableStatement(this, stmt, key); } - return conn.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); + CallableStatement stmt = conn.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); + + holder.getDataSource().initStatement(stmt); + + CallableStatement rtnVal = new PoolableCallableStatement(this, stmt, key); + + holder.addTrace(rtnVal); + + return rtnVal; } @Override public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); + PreparedStatementKey key = new PreparedStatementKey(sql, getCatalog(), MethodType.Precall_3); if (holder.isPoolPreparedStatements()) { - PreparedStatementKey key = new PreparedStatementKey(sql, getCatalog(), MethodType.Precall_3); PoolableCallableStatement poolableStatement = (PoolableCallableStatement) holder.getStatementPool().get(key); if (poolableStatement != null) { poolableStatement.setPoolableConnection(this); + poolableStatement.setClosed(false); + holder.addTrace(poolableStatement); return poolableStatement; } - - CallableStatement stmt = conn.prepareCall(sql, resultSetType, resultSetConcurrency); - - holder.getDataSource().initStatement(stmt); - - return new PoolableCallableStatement(this, stmt, key); } - return conn.prepareCall(sql, resultSetType, resultSetConcurrency); + CallableStatement stmt = conn.prepareCall(sql, resultSetType, resultSetConcurrency); + + holder.getDataSource().initStatement(stmt); + + CallableStatement rtnVal = new PoolableCallableStatement(this, stmt, key); + holder.addTrace(rtnVal); + + return rtnVal; } // ////////////////////