From ce9c120dbea603d237eeda2ab637ed0e5a01fc76 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 19 Dec 2012 12:59:37 +0800 Subject: [PATCH] WallConfig.allowWrap change default true --- .../pool/DruidPooledPreparedStatement.java | 6 +- .../com/alibaba/druid/util/OracleUtils.java | 39 +++++--- .../com/alibaba/druid/wall/WallConfig.java | 2 +- .../druid/bvt/pool/TestOracleWall.java | 83 +++++++++++++++++ .../druid/bvt/pool/TestOracleWall2.java | 90 +++++++++++++++++++ .../druid/test/util/OracleMockDriver.java | 10 +++ 6 files changed, 216 insertions(+), 14 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/pool/TestOracleWall.java create mode 100644 src/test/java/com/alibaba/druid/bvt/pool/TestOracleWall2.java diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java index 6f3a2dbc58..88cc47c7dd 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java @@ -499,8 +499,10 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement if (holder.getDefaultRowPretch() == -1) { int defaultRowPretch = OracleUtils.getRowPrefetch(this); - holder.setDefaultRowPretch(defaultRowPretch); - holder.setRowPrefetch(defaultRowPretch); + if (defaultRowPretch != holder.getDefaultRowPretch()) { + holder.setDefaultRowPretch(defaultRowPretch); + holder.setRowPrefetch(defaultRowPretch); + } } int rowPrefetch; diff --git a/src/main/java/com/alibaba/druid/util/OracleUtils.java b/src/main/java/com/alibaba/druid/util/OracleUtils.java index 2b6a119054..c9c567ea8f 100644 --- a/src/main/java/com/alibaba/druid/util/OracleUtils.java +++ b/src/main/java/com/alibaba/druid/util/OracleUtils.java @@ -31,42 +31,53 @@ import oracle.jdbc.xa.client.OracleXAConnection; import oracle.sql.ROWID; import com.alibaba.druid.pool.DruidPooledConnection; -import com.alibaba.druid.pool.DruidPooledPreparedStatement; +import com.alibaba.druid.support.logging.Log; +import com.alibaba.druid.support.logging.LogFactory; public class OracleUtils { + private final static Log LOG = LogFactory.getLog(OracleUtils.class); + public static XAConnection OracleXAConnection(Connection oracleConnection) throws XAException { return new OracleXAConnection(oracleConnection); } - public static void clearDefines(DruidPooledPreparedStatement stmt) throws SQLException { - OracleStatement oracleStmt = stmt.unwrap(OracleStatement.class); - oracleStmt.clearDefines(); - } - public static int getRowPrefetch(PreparedStatement stmt) throws SQLException { OracleStatement oracleStmt = stmt.unwrap(OracleStatement.class); + + if (oracleStmt == null) { + return -1; + } + return oracleStmt.getRowPrefetch(); } public static void setRowPrefetch(PreparedStatement stmt, int value) throws SQLException { OracleStatement oracleStmt = stmt.unwrap(OracleStatement.class); - oracleStmt.setRowPrefetch(value); + if (oracleStmt != null) { + oracleStmt.setRowPrefetch(value); + } } public static void enterImplicitCache(PreparedStatement stmt) throws SQLException { oracle.jdbc.internal.OraclePreparedStatement oracleStmt = unwrapInternal(stmt); - oracleStmt.enterImplicitCache(); + if (oracleStmt != null) { + oracleStmt.enterImplicitCache(); + } } public static void exitImplicitCacheToClose(PreparedStatement stmt) throws SQLException { oracle.jdbc.internal.OraclePreparedStatement oracleStmt = unwrapInternal(stmt); - oracleStmt.exitImplicitCacheToClose(); + if (oracleStmt != null) { + oracleStmt.exitImplicitCacheToClose(); + } } public static void exitImplicitCacheToActive(PreparedStatement stmt) throws SQLException { oracle.jdbc.internal.OraclePreparedStatement oracleStmt = unwrapInternal(stmt); - oracleStmt.exitImplicitCacheToActive(); + if (oracleStmt != null) { + oracleStmt.exitImplicitCacheToActive(); + } } public static OraclePreparedStatement unwrapInternal(PreparedStatement stmt) throws SQLException { @@ -74,7 +85,13 @@ public class OracleUtils { return (OraclePreparedStatement) stmt; } - return stmt.unwrap(OraclePreparedStatement.class); + OraclePreparedStatement unwrapped = stmt.unwrap(OraclePreparedStatement.class); + + if (unwrapped == null) { + LOG.error("can not unwrap statement : " + stmt.getClass()); + } + + return unwrapped; } public static short getVersionNumber(DruidPooledConnection conn) throws SQLException { diff --git a/src/main/java/com/alibaba/druid/wall/WallConfig.java b/src/main/java/com/alibaba/druid/wall/WallConfig.java index 05a72546f4..d4a4f4d9eb 100644 --- a/src/main/java/com/alibaba/druid/wall/WallConfig.java +++ b/src/main/java/com/alibaba/druid/wall/WallConfig.java @@ -76,7 +76,7 @@ public class WallConfig implements WallConfigMBean { private String tenantTablePattern; private String tenantColumn; - private boolean wrapAllow = false; + private boolean wrapAllow = true; private boolean metadataAllow = true; public WallConfig(){ diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestOracleWall.java b/src/test/java/com/alibaba/druid/bvt/pool/TestOracleWall.java new file mode 100644 index 0000000000..9173cd7c6c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestOracleWall.java @@ -0,0 +1,83 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.pool; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.test.util.OracleMockDriver; +import com.alibaba.druid.util.JdbcUtils; + +public class TestOracleWall extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + + dataSource.setOracle(true); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setDriver(new OracleMockDriver()); + dataSource.setPoolPreparedStatements(true); + dataSource.setConnectionProperties("defaultRowPrefetch=50"); + dataSource.setFilters("stat,wall"); + dataSource.setDbType("oracle"); + // dataSource.setFilters("log4j"); + } + + protected void tearDown() throws Exception { + JdbcUtils.close(dataSource); + } + + public void test_oracle() throws Exception { + + String sql = "SELECT 1"; + + { + Connection conn = dataSource.getConnection(); + + PreparedStatement stmt = conn.prepareStatement(sql); + + ResultSet rs = stmt.executeQuery(); + rs.next(); + + rs.close(); + stmt.close(); + conn.close(); + } + + { + Connection conn = dataSource.getConnection(); + + PreparedStatement stmt = conn.prepareStatement(sql); + + ResultSet rs = stmt.executeQuery(); + rs.next(); + rs.close(); + stmt.close(); + + conn.close(); + } + + Assert.assertEquals(1, dataSource.getCachedPreparedStatementCount()); + + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestOracleWall2.java b/src/test/java/com/alibaba/druid/bvt/pool/TestOracleWall2.java new file mode 100644 index 0000000000..6e27447e37 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestOracleWall2.java @@ -0,0 +1,90 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.pool; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.test.util.OracleMockDriver; +import com.alibaba.druid.util.JdbcUtils; +import com.alibaba.druid.wall.WallConfig; +import com.alibaba.druid.wall.WallFilter; + +public class TestOracleWall2 extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + + WallFilter wall = new WallFilter(); + wall.setConfig(new WallConfig()); + wall.getConfig().setWrapAllow(false); + + dataSource.setOracle(true); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setDriver(new OracleMockDriver()); + dataSource.setPoolPreparedStatements(true); + dataSource.setConnectionProperties("defaultRowPrefetch=50"); + dataSource.setFilters("stat"); + dataSource.getProxyFilters().add(wall); + dataSource.setDbType("oracle"); + // dataSource.setFilters("log4j"); + } + + protected void tearDown() throws Exception { + JdbcUtils.close(dataSource); + } + + public void test_oracle() throws Exception { + + String sql = "SELECT 1"; + + { + Connection conn = dataSource.getConnection(); + + PreparedStatement stmt = conn.prepareStatement(sql); + + ResultSet rs = stmt.executeQuery(); + rs.next(); + + rs.close(); + stmt.close(); + conn.close(); + } + + for (int i = 0; i < 10; ++i) { + Connection conn = dataSource.getConnection(); + + PreparedStatement stmt = conn.prepareStatement(sql); + + ResultSet rs = stmt.executeQuery(); + rs.next(); + rs.close(); + stmt.close(); + + conn.close(); + } + + Assert.assertEquals(1, dataSource.getCachedPreparedStatementCount()); + + } +} diff --git a/src/test/java/com/alibaba/druid/test/util/OracleMockDriver.java b/src/test/java/com/alibaba/druid/test/util/OracleMockDriver.java index d94ca7516b..044480f644 100644 --- a/src/test/java/com/alibaba/druid/test/util/OracleMockDriver.java +++ b/src/test/java/com/alibaba/druid/test/util/OracleMockDriver.java @@ -26,4 +26,14 @@ public class OracleMockDriver extends MockDriver { public Connection connect(String url, Properties info) throws SQLException { return new OracleMockConnection(this, url, info); } + + @Override + public int getMajorVersion() { + return 11; + } + + @Override + public int getMinorVersion() { + return 0; + } }