diff --git a/README b/README index 18d8c362f1..cd1c4dd564 100644 --- a/README +++ b/README @@ -1,2 +1,9 @@ +mvn install:install-file -Dfile=lib/oracle/9.2.0.8/ojdbc14_g.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=9.2.0.8 -Dpackaging=jar -DgeneratePom=true + +mvn install:install-file -Dfile=lib/oracle/10.1.0.5/ojdbc14_g.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.1.0.5 -Dpackaging=jar -DgeneratePom=true + +mvn install:install-file -Dfile=lib/oracle/10.2.0.2/ojdbc14_g.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.2 -Dpackaging=jar -DgeneratePom=true +mvn install:install-file -Dfile=lib/oracle/10.2.0.5/ojdbc14_g.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.5 -Dpackaging=jar -DgeneratePom=true + mvn install:install-file -Dfile=lib/oracle/11.2.0.3/ojdbc5_g.jar -DgroupId=com.oracle -DartifactId=ojdbc5 -Dversion=11.2.0.3 -Dpackaging=jar -DgeneratePom=true mvn install:install-file -Dfile=lib/oracle/11.2.0.3/ojdbc6_g.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar -DgeneratePom=true \ No newline at end of file diff --git a/lib/oracle/10.1.0.5/ojdbc14_g.jar b/lib/oracle/10.1.0.5/ojdbc14_g.jar new file mode 100644 index 0000000000..88f4cad54e Binary files /dev/null and b/lib/oracle/10.1.0.5/ojdbc14_g.jar differ diff --git a/lib/oracle/10.2.0.2/ojdbc14_g.jar b/lib/oracle/10.2.0.2/ojdbc14_g.jar new file mode 100644 index 0000000000..7837e972a5 Binary files /dev/null and b/lib/oracle/10.2.0.2/ojdbc14_g.jar differ diff --git a/lib/oracle/10.2.0.5/ojdbc14_g.jar b/lib/oracle/10.2.0.5/ojdbc14_g.jar new file mode 100644 index 0000000000..822349f54b Binary files /dev/null and b/lib/oracle/10.2.0.5/ojdbc14_g.jar differ diff --git a/lib/oracle/9.2.0.8/ojdbc14_g.jar b/lib/oracle/9.2.0.8/ojdbc14_g.jar new file mode 100644 index 0000000000..1dc75b9dd7 Binary files /dev/null and b/lib/oracle/9.2.0.8/ojdbc14_g.jar differ diff --git a/pom.xml b/pom.xml index 62b060b3c2..45434bac99 100644 --- a/pom.xml +++ b/pom.xml @@ -170,21 +170,13 @@ 1.1.1 provided - + org.springframework spring 2.0 provided - log4j @@ -232,16 +224,28 @@ 9.1-901-1.jdbc4 provided - + - + + com.oracle + ojdbc14 + 10.2.0.2 + provided + + + + org.nutz + nutz + 1.b.40 + test + junit diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 550d43c7cf..c7956f851e 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -211,7 +211,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements protected boolean isOracle = false; - protected boolean useOracleImplicitCache = false; + protected boolean useOracleImplicitCache = true; public boolean isOracle() { return isOracle; @@ -229,7 +229,16 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } public void setUseOracleImplicitCache(boolean useOracleImplicitCache) { - this.useOracleImplicitCache = useOracleImplicitCache; + if (this.useOracleImplicitCache != useOracleImplicitCache) { + this.useOracleImplicitCache = useOracleImplicitCache; + boolean isOracleDriver10 = isOracle() && this.driver != null && this.driver.getMajorVersion() == 10; + + if (isOracleDriver10) { + this.getConnectProperties().setProperty("oracle.jdbc.FreeMemoryOnEnterImplicitCache", "true"); + } else { + this.getConnectProperties().remove("oracle.jdbc.FreeMemoryOnEnterImplicitCache"); + } + } } public Throwable getLastCreateError() { diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 126aefef6d..85e7b38142 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -295,6 +295,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat throw new SQLException("not support oracle driver " + driver.getMajorVersion() + "." + driver.getMinorVersion()); } + + if (driver.getMajorVersion() == 10 && isUseOracleImplicitCache()) { + this.getConnectProperties().setProperty("oracle.jdbc.FreeMemoryOnEnterImplicitCache", "true"); + } } String realDriverClassName = driver.getClass().getName(); @@ -1334,7 +1338,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat @Override public String getVersion() { - return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion + "-2011-12-27 14:45"; + return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion + "-2012-1-6 10:14"; } } diff --git a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java index d18fd2408c..1376277236 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java @@ -1,21 +1,39 @@ package com.alibaba.druid.pool.vendor; import java.io.Serializable; +import java.lang.reflect.Method; import java.sql.Connection; +import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; import com.alibaba.druid.logging.Log; import com.alibaba.druid.logging.LogFactory; +import com.alibaba.druid.pool.DruidPooledConnection; import com.alibaba.druid.pool.ValidConnectionChecker; -import com.alibaba.druid.util.MySqlUtils; +import com.alibaba.druid.proxy.jdbc.ConnectionProxy; +import com.alibaba.druid.util.DruidLoaderUtils; +import com.alibaba.druid.util.JdbcUtils; public class MySqlValidConnectionChecker implements ValidConnectionChecker, Serializable { - private static final long serialVersionUID = 1L; - private static final Log LOG = LogFactory.getLog(MySqlValidConnectionChecker.class); + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(MySqlValidConnectionChecker.class); + + private Class clazz; + private Method ping; + private boolean driverHasPingMethod = false; public MySqlValidConnectionChecker(){ - + try { + clazz = DruidLoaderUtils.loadClass("com.mysql.jdbc.Connection"); + ping = clazz.getMethod("ping"); + if (ping != null) { + driverHasPingMethod = true; + } + } catch (Exception e) { + LOG.warn("Cannot resolve com.mysq.jdbc.Connection.ping method. Will use 'SELECT 1' instead.", e); + } } public boolean isValidConnection(Connection conn, String valiateQuery, int validationQueryTimeout) { @@ -32,12 +50,41 @@ public class MySqlValidConnectionChecker implements ValidConnectionChecker, Seri return true; } + if (driverHasPingMethod) { + if (conn instanceof DruidPooledConnection) { + conn = ((DruidPooledConnection) conn).getConnection(); + } + + if (conn instanceof ConnectionProxy) { + conn = ((ConnectionProxy) conn).getRawObject(); + } + + if (clazz.isAssignableFrom(conn.getClass())) { + try { + ping.invoke(conn); + return true; + } catch (Exception e) { + LOG.warn("Unexpected error in ping", e); + return false; + } + } + } + + Statement stmt = null; + ResultSet rs = null; try { - MySqlUtils.ping(conn); + stmt = conn.createStatement(); + stmt.setQueryTimeout(validationQueryTimeout); + rs = stmt.executeQuery(valiateQuery); return true; + } catch (SQLException e) { + return false; } catch (Exception e) { LOG.warn("Unexpected error in ping", e); return false; + } finally { + JdbcUtils.close(rs); + JdbcUtils.close(stmt); } } diff --git a/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java index ff0d70b283..1cc8eaf82b 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java @@ -22,24 +22,37 @@ package com.alibaba.druid.pool.vendor; import java.io.Serializable; +import java.lang.reflect.Method; import java.sql.Connection; +import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; import com.alibaba.druid.logging.Log; import com.alibaba.druid.logging.LogFactory; import com.alibaba.druid.pool.DruidPooledConnection; import com.alibaba.druid.pool.ValidConnectionChecker; import com.alibaba.druid.proxy.jdbc.ConnectionProxy; -import com.alibaba.druid.util.OracleUtils; +import com.alibaba.druid.util.DruidLoaderUtils; +import com.alibaba.druid.util.JdbcUtils; public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable { - private static final long serialVersionUID = -2227528634302168877L; + private static final long serialVersionUID = -2227528634302168877L; - private static final Log LOG = LogFactory.getLog(OracleValidConnectionChecker.class); + private static final Log LOG = LogFactory.getLog(OracleValidConnectionChecker.class); + + private final Class clazz; + private final Method ping; + private final static Object[] params = new Object[] { new Integer(5000) }; public OracleValidConnectionChecker(){ - + try { + clazz = DruidLoaderUtils.loadClass("oracle.jdbc.driver.OracleConnection"); + ping = clazz.getMethod("pingDatabase", new Class[] { Integer.TYPE }); + } catch (Exception e) { + throw new RuntimeException("Unable to resolve pingDatabase method:", e); + } } public boolean isValidConnection(Connection conn, String valiateQuery, int validationQueryTimeout) { @@ -65,14 +78,33 @@ public class OracleValidConnectionChecker implements ValidConnectionChecker, Ser conn = ((ConnectionProxy) conn).getRawObject(); } - int status = OracleUtils.pingDatabase(conn); + // unwrap + if (clazz.isAssignableFrom(conn.getClass())) { + Integer status = (Integer) ping.invoke(conn, params); - // Error - if (status < 0) { - return false; + // Error + if (status.intValue() < 0) { + return false; + } + + return true; } - return true; + Statement stmt = null; + ResultSet rs = null; + try { + stmt = conn.createStatement(); + rs = stmt.executeQuery(valiateQuery); + return true; + } catch (SQLException e) { + return false; + } catch (Exception e) { + LOG.warn("Unexpected error in ping", e); + return false; + } finally { + JdbcUtils.close(rs); + JdbcUtils.close(stmt); + } } catch (Exception e) { LOG.warn("Unexpected error in pingDatabase", e); } diff --git a/src/main/java/com/alibaba/druid/util/OracleUtils.java b/src/main/java/com/alibaba/druid/util/OracleUtils.java index d0cd5b70a7..981d133f75 100644 --- a/src/main/java/com/alibaba/druid/util/OracleUtils.java +++ b/src/main/java/com/alibaba/druid/util/OracleUtils.java @@ -88,7 +88,6 @@ public class OracleUtils { oracleConn.setStatementCacheSize(size); } - @SuppressWarnings("deprecation") public static int pingDatabase(Connection conn) throws SQLException { OracleConnection oracleConn = unwrap(conn); return oracleConn.pingDatabase(1000); diff --git a/src/test/java/com/alibaba/druid/TestOracle.java b/src/test/java/com/alibaba/druid/TestOracle.java new file mode 100644 index 0000000000..0879bd400d --- /dev/null +++ b/src/test/java/com/alibaba/druid/TestOracle.java @@ -0,0 +1,70 @@ +package com.alibaba.druid; + +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; + +public class TestOracle extends TestCase { + + private String jdbcUrl; + private String user; + private String password; + private String driverClass; + private String SQL; + + protected void setUp() throws Exception { + // jdbcUrl = "jdbc:oracle:thin:@10.20.149.85:1521:ocnauto"; + // user = "alibaba"; + // password = "ccbuauto"; + // SQL = "SELECT * FROM WP_ORDERS WHERE ID = ?"; + + jdbcUrl = "jdbc:oracle:thin:@10.20.149.81:1521:ointest3"; + user = "alibaba"; + password = "deYcR7facWSJtCuDpm2r"; + SQL = "SELECT * FROM AV_INFO WHERE ID = ?"; + + driverClass = "oracle.jdbc.driver.OracleDriver"; + } + + public void test_o() throws Exception { + DruidDataSource dataSource = new DruidDataSource(); + + dataSource.setDriverClassName(driverClass); + dataSource.setUrl(jdbcUrl); + dataSource.setUsername(user); + dataSource.setPassword(password); + dataSource.setPoolPreparedStatements(true); + dataSource.setMaxOpenPreparedStatements(50); + dataSource.setUseOracleImplicitCache(true); + // dataSource.setConnectionProperties("oracle.jdbc.FreeMemoryOnEnterImplicitCache=true"); + + for (int i = 1; i <= 1; ++i) { + Connection conn = dataSource.getConnection(); + + int rowNum = i + 1; // (i % 50) + 1; + String sql = SQL + " AND ROWNUM <= " + rowNum; + PreparedStatement stmt = conn.prepareStatement(sql); + stmt.setInt(1, 61); + ResultSet rs = stmt.executeQuery(); + int rowCount = 0; + while (rs.next()) { + rowCount++; + } + Assert.assertEquals(true, rowCount > 0); + // Assert.isTrue(!rs.isClosed()); + rs.close(); + // Assert.isTrue(!stmt.isClosed()); + stmt.close(); + + conn.close(); + + } + + dataSource.close(); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/bug/TestRollBack.java b/src/test/java/com/alibaba/druid/bvt/bug/TestRollBack.java new file mode 100644 index 0000000000..a80e75e6ae --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/bug/TestRollBack.java @@ -0,0 +1,105 @@ +package com.alibaba.druid.bvt.bug; + +import java.beans.PropertyVetoException; +import java.sql.SQLException; + +import junit.framework.Assert; + +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.impl.NutDao; +import org.nutz.trans.Atom; +import org.nutz.trans.Trans; + +import com.alibaba.druid.pool.DruidDataSource; +import com.mchange.v2.c3p0.ComboPooledDataSource; + +public class TestRollBack { + static ComboPooledDataSource c3p0; + static DruidDataSource druid; + static Dao dao_c3p0; + static Dao dao_druid; + + static String url = "jdbc:oracle:thin:@10.20.149.85:1521:ocnauto"; + static String user = "alibaba"; + static String password = "ccbuauto"; + +// jdbcUrl = "jdbc:oracle:thin:@10.20.149.85:1521:ocnauto"; +// user = "alibaba"; +// password = "ccbuauto"; + + @BeforeClass + public static void init() throws PropertyVetoException, SQLException { + c3p0 = new ComboPooledDataSource(); + c3p0.setDriverClass("oracle.jdbc.driver.OracleDriver"); + c3p0.setJdbcUrl(url); + c3p0.setUser(user); + c3p0.setPassword(password); + + druid = new DruidDataSource(); + druid.setUrl(url); + druid.setUsername(user); + druid.setPassword(password); + druid.setFilters("stat,trace,encoding"); + druid.setDefaultAutoCommit(false); + + dao_c3p0 = new NutDao(c3p0); + dao_druid = new NutDao(druid); + if (!dao_c3p0.exists("msg")) { + dao_c3p0.execute(Sqls.create("create table msg(message varchar2(5))")); // 字段长度5 + } + } + + @AfterClass + public static void destory() { + c3p0.close(); + druid.close(); + } + + @Before + public void before() { + // 清空所有数据 + dao_c3p0.clear("msg"); + } + + @Test + public void test_c3p0() { + try { + // 将两条插入语句包裹在一个事务内执行,第一条可以正常插入,第二条超过字段长度,会抛异常,事务会回滚 + Trans.exec(new Atom() { + @Override + public void run() { + dao_c3p0.insert("msg", Chain.make("message", "abc")); + dao_c3p0.insert("msg", Chain.make("message", "1234567")); + } + }); + } catch (Exception e) { + } + // abc也跟着回滚了 + Assert.assertNull(dao_c3p0.fetch("msg", Cnd.where("message", "=", "abc"))); + } + + @Test + public void test_druid() { + try { + Trans.exec(new Atom() { + @Override + public void run() { + dao_druid.insert("msg", Chain.make("message", "abc")); + dao_druid.insert("msg", Chain.make("message", "1234567")); + } + }); + } catch (Exception e) { + e.printStackTrace(); // 把这里的异常打印出来 + } + // abc插了进去,没有回滚 + Assert.assertNotNull(dao_druid.fetch("msg", Cnd.where("message", "=", "abc"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/util/OracleMockConnection.java b/src/test/java/com/alibaba/druid/bvt/util/OracleMockConnection.java index 99766e658d..ea3681edfe 100644 --- a/src/test/java/com/alibaba/druid/bvt/util/OracleMockConnection.java +++ b/src/test/java/com/alibaba/druid/bvt/util/OracleMockConnection.java @@ -11,17 +11,11 @@ import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; -import java.util.EnumSet; import java.util.Properties; import java.util.TimeZone; import oracle.jdbc.OracleOCIFailover; import oracle.jdbc.OracleSavepoint; -import oracle.jdbc.aq.AQDequeueOptions; -import oracle.jdbc.aq.AQEnqueueOptions; -import oracle.jdbc.aq.AQMessage; -import oracle.jdbc.aq.AQNotificationRegistration; -import oracle.jdbc.dcn.DatabaseChangeRegistration; import oracle.jdbc.internal.OracleConnection; import oracle.jdbc.pool.OracleConnectionCacheCallback; import oracle.sql.ARRAY; @@ -50,872 +44,672 @@ public class OracleMockConnection extends MockConnection implements oracle.jdbc. public OracleMockConnection(MockDriver driver, String url, Properties connectProperties){ super(driver, url, connectProperties); - + String val = (String) connectProperties.get("defaultRowPrefetch"); if (val != null) { defaultRowPrefetch = Integer.parseInt(val); } } - @Override public Connection _getPC() { // TODO Auto-generated method stub return null; } - @Override public void abort() throws SQLException { // TODO Auto-generated method stub } - @Override public void applyConnectionAttributes(Properties arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void archive(int arg0, int arg1, String arg2) throws SQLException { // TODO Auto-generated method stub } - @Override public void cancel() throws SQLException { // TODO Auto-generated method stub } - @Override public void clearAllApplicationContext(String arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void close(Properties arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void close(int arg0) throws SQLException { // TODO Auto-generated method stub } - @Override - public void commit(EnumSet arg0) throws SQLException { - // TODO Auto-generated method stub - - } - - @Override public ARRAY createARRAY(String arg0, Object arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public BINARY_DOUBLE createBINARY_DOUBLE(double arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public BINARY_FLOAT createBINARY_FLOAT(float arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public DATE createDATE(Date arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public DATE createDATE(Time arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public DATE createDATE(Timestamp arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public DATE createDATE(String arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public DATE createDATE(Date arg0, Calendar arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public DATE createDATE(Time arg0, Calendar arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public DATE createDATE(Timestamp arg0, Calendar arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public INTERVALDS createINTERVALDS(String arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public INTERVALYM createINTERVALYM(String arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public NUMBER createNUMBER(boolean arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public NUMBER createNUMBER(byte arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public NUMBER createNUMBER(short arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public NUMBER createNUMBER(int arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public NUMBER createNUMBER(long arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public NUMBER createNUMBER(float arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public NUMBER createNUMBER(double arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public NUMBER createNUMBER(BigDecimal arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public NUMBER createNUMBER(BigInteger arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public NUMBER createNUMBER(String arg0, int arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public Array createOracleArray(String arg0, Object arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMP createTIMESTAMP(Date arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMP createTIMESTAMP(DATE arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMP createTIMESTAMP(Time arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMP createTIMESTAMP(Timestamp arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMP createTIMESTAMP(String arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPLTZ createTIMESTAMPLTZ(Date arg0, Calendar arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPLTZ createTIMESTAMPLTZ(Time arg0, Calendar arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPLTZ createTIMESTAMPLTZ(Timestamp arg0, Calendar arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPLTZ createTIMESTAMPLTZ(String arg0, Calendar arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPLTZ createTIMESTAMPLTZ(DATE arg0, Calendar arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPTZ createTIMESTAMPTZ(Date arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPTZ createTIMESTAMPTZ(Time arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPTZ createTIMESTAMPTZ(Timestamp arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPTZ createTIMESTAMPTZ(String arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPTZ createTIMESTAMPTZ(DATE arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPTZ createTIMESTAMPTZ(Date arg0, Calendar arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPTZ createTIMESTAMPTZ(Time arg0, Calendar arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPTZ createTIMESTAMPTZ(Timestamp arg0, Calendar arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TIMESTAMPTZ createTIMESTAMPTZ(String arg0, Calendar arg1) throws SQLException { // TODO Auto-generated method stub return null; } - @Override - public AQMessage dequeue(String arg0, AQDequeueOptions arg1, byte[] arg2) throws SQLException { - // TODO Auto-generated method stub - return null; - } - - @Override - public AQMessage dequeue(String arg0, AQDequeueOptions arg1, String arg2) throws SQLException { - // TODO Auto-generated method stub - return null; - } - - @Override - public void enqueue(String arg0, AQEnqueueOptions arg1, AQMessage arg2) throws SQLException { - // TODO Auto-generated method stub - - } - - @Override public TypeDescriptor[] getAllTypeDescriptorsInCurrentSchema() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public String getAuthenticationAdaptorName() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public boolean getAutoClose() throws SQLException { // TODO Auto-generated method stub return false; } - @Override public CallableStatement getCallWithKey(String arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public Properties getConnectionAttributes() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public int getConnectionReleasePriority() throws SQLException { // TODO Auto-generated method stub return 0; } - @Override public boolean getCreateStatementAsRefCursor() { // TODO Auto-generated method stub return false; } - @Override public String getCurrentSchema() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public String getDataIntegrityAlgorithmName() throws SQLException { // TODO Auto-generated method stub return null; } - @Override - public DatabaseChangeRegistration getDatabaseChangeRegistration(int arg0) throws SQLException { - // TODO Auto-generated method stub - return null; - } - - @Override public int getDefaultExecuteBatch() { // TODO Auto-generated method stub return 0; } - @Override public int getDefaultRowPrefetch() { return defaultRowPrefetch; } - @Override public TimeZone getDefaultTimeZone() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public Object getDescriptor(String arg0) { // TODO Auto-generated method stub return null; } - @Override public String getEncryptionAlgorithmName() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public short getEndToEndECIDSequenceNumber() throws SQLException { // TODO Auto-generated method stub return 0; } - @Override public String[] getEndToEndMetrics() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public boolean getExplicitCachingEnabled() throws SQLException { // TODO Auto-generated method stub return false; } - @Override public boolean getImplicitCachingEnabled() throws SQLException { // TODO Auto-generated method stub return false; } - @Override public boolean getIncludeSynonyms() { // TODO Auto-generated method stub return false; } - @Override public Object getJavaObject(String arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public Properties getProperties() { // TODO Auto-generated method stub return null; } - @Override public boolean getRemarksReporting() { // TODO Auto-generated method stub return false; } - @Override public boolean getRestrictGetTables() { // TODO Auto-generated method stub return false; } - @Override public String getSQLType(Object arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public String getSessionTimeZone() { // TODO Auto-generated method stub return null; } - @Override public String getSessionTimeZoneOffset() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public int getStatementCacheSize() throws SQLException { // TODO Auto-generated method stub return 0; } - @Override public PreparedStatement getStatementWithKey(String arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public int getStmtCacheSize() { // TODO Auto-generated method stub return 0; } - @Override public short getStructAttrCsId() throws SQLException { // TODO Auto-generated method stub return 0; } - @Override public TypeDescriptor[] getTypeDescriptorsFromList(String[][] arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public TypeDescriptor[] getTypeDescriptorsFromListInCurrentSchema(String[] arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public Properties getUnMatchedConnectionAttributes() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public String getUserName() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public boolean getUsingXAFlag() { // TODO Auto-generated method stub return false; } - @Override public boolean getXAErrorFlag() { // TODO Auto-generated method stub return false; } - @Override public boolean isLogicalConnection() { // TODO Auto-generated method stub return false; } - @Override public boolean isProxySession() { // TODO Auto-generated method stub return false; } - @Override public boolean isUsable() { // TODO Auto-generated method stub return false; } - @Override public void openProxySession(int arg0, Properties arg1) throws SQLException { // TODO Auto-generated method stub } - @Override public void oracleReleaseSavepoint(OracleSavepoint arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void oracleRollback(OracleSavepoint arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public OracleSavepoint oracleSetSavepoint() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public OracleSavepoint oracleSetSavepoint(String arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public OracleConnection physicalConnectionWithin() { // TODO Auto-generated method stub return null; } - @Override public int pingDatabase() throws SQLException { // TODO Auto-generated method stub return 0; } - @Override public int pingDatabase(int arg0) throws SQLException { // TODO Auto-generated method stub return 0; } - @Override public CallableStatement prepareCallWithKey(String arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public PreparedStatement prepareStatementWithKey(String arg0) throws SQLException { // TODO Auto-generated method stub return null; } - @Override public void purgeExplicitCache() throws SQLException { // TODO Auto-generated method stub } - @Override public void purgeImplicitCache() throws SQLException { // TODO Auto-generated method stub } - @Override public void putDescriptor(String arg0, Object arg1) throws SQLException { // TODO Auto-generated method stub } - @Override - public AQNotificationRegistration[] registerAQNotification(String[] arg0, Properties[] arg1, Properties arg2) - throws SQLException { - // TODO Auto-generated method stub - return null; - } - - @Override public void registerConnectionCacheCallback(OracleConnectionCacheCallback arg0, Object arg1, int arg2) throws SQLException { // TODO Auto-generated method stub } - @Override - public DatabaseChangeRegistration registerDatabaseChangeNotification(Properties arg0) throws SQLException { - // TODO Auto-generated method stub - return null; - } - - @Override public void registerSQLType(String arg0, Class arg1) throws SQLException { // TODO Auto-generated method stub } - @Override public void registerSQLType(String arg0, String arg1) throws SQLException { // TODO Auto-generated method stub } - @Override public void registerTAFCallback(OracleOCIFailover arg0, Object arg1) throws SQLException { // TODO Auto-generated method stub } - @Override public void setApplicationContext(String arg0, String arg1, String arg2) throws SQLException { // TODO Auto-generated method stub } - @Override public void setAutoClose(boolean arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void setConnectionReleasePriority(int arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void setCreateStatementAsRefCursor(boolean arg0) { // TODO Auto-generated method stub } - @Override public void setDefaultExecuteBatch(int arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void setDefaultRowPrefetch(int defaultRowPrefetch) throws SQLException { this.defaultRowPrefetch = defaultRowPrefetch; } - @Override public void setDefaultTimeZone(TimeZone arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void setEndToEndMetrics(String[] arg0, short arg1) throws SQLException { // TODO Auto-generated method stub } - @Override public void setExplicitCachingEnabled(boolean arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void setImplicitCachingEnabled(boolean arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void setIncludeSynonyms(boolean arg0) { // TODO Auto-generated method stub } - @Override public void setPlsqlWarnings(String arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void setRemarksReporting(boolean arg0) { // TODO Auto-generated method stub } - @Override public void setRestrictGetTables(boolean arg0) { // TODO Auto-generated method stub } - @Override public void setSessionTimeZone(String arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void setStatementCacheSize(int arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void setStmtCacheSize(int arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void setStmtCacheSize(int arg0, boolean arg1) throws SQLException { // TODO Auto-generated method stub } - @Override public void setUsingXAFlag(boolean arg0) { // TODO Auto-generated method stub } - @Override public void setWrapper(oracle.jdbc.OracleConnection arg0) { // TODO Auto-generated method stub } - @Override public void setXAErrorFlag(boolean arg0) { // TODO Auto-generated method stub } - @Override - public void shutdown(DatabaseShutdownMode arg0) throws SQLException { - // TODO Auto-generated method stub - - } - - @Override - public void startup(DatabaseStartupMode arg0) throws SQLException { - // TODO Auto-generated method stub - - } - - @Override public void startup(String arg0, int arg1) throws SQLException { // TODO Auto-generated method stub } - @Override - public void unregisterAQNotification(AQNotificationRegistration arg0) throws SQLException { - // TODO Auto-generated method stub - - } - - @Override - public void unregisterDatabaseChangeNotification(DatabaseChangeRegistration arg0) throws SQLException { - // TODO Auto-generated method stub - - } - - @Override public void unregisterDatabaseChangeNotification(int arg0) throws SQLException { // TODO Auto-generated method stub } - @Override public void unregisterDatabaseChangeNotification(long arg0, String arg1) throws SQLException { // TODO Auto-generated method stub } - @Override public void unregisterDatabaseChangeNotification(int arg0, String arg1, int arg2) throws SQLException { // TODO Auto-generated method stub } - @Override public oracle.jdbc.OracleConnection unwrap() { // TODO Auto-generated method stub return null; } - - @Override + public PreparedStatement prepareStatement(String sql) throws SQLException { if (isClosed()) { throw new MockConnectionClosedException(); @@ -923,4 +717,10 @@ public class OracleMockConnection extends MockConnection implements oracle.jdbc. return new OracleMockPreparedStatement(this, sql); } + + @Override + public void shutdown(int arg0) throws SQLException { + // TODO Auto-generated method stub + + } } diff --git a/src/test/java/com/alibaba/druid/bvt/util/OracleMockPreparedStatement.java b/src/test/java/com/alibaba/druid/bvt/util/OracleMockPreparedStatement.java index ea00c169b0..16967eee89 100644 --- a/src/test/java/com/alibaba/druid/bvt/util/OracleMockPreparedStatement.java +++ b/src/test/java/com/alibaba/druid/bvt/util/OracleMockPreparedStatement.java @@ -17,7 +17,6 @@ import java.util.Calendar; import oracle.jdbc.OracleParameterMetaData; import oracle.jdbc.OracleResultSetCache; -import oracle.jdbc.dcn.DatabaseChangeRegistration; import oracle.sql.ARRAY; import oracle.sql.BFILE; import oracle.sql.BINARY_DOUBLE; @@ -83,25 +82,21 @@ public class OracleMockPreparedStatement extends MockPreparedStatement implement return executeBatch; } - @Override public ResultSet getReturnResultSet() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public void registerReturnParameter(int arg0, int arg1) throws SQLException { // TODO Auto-generated method stub } - @Override public void registerReturnParameter(int arg0, int arg1, int arg2) throws SQLException { // TODO Auto-generated method stub } - @Override public void registerReturnParameter(int arg0, int arg1, String arg2) throws SQLException { // TODO Auto-generated method stub @@ -257,13 +252,11 @@ public class OracleMockPreparedStatement extends MockPreparedStatement implement } - @Override public void setBytesForBlob(int arg0, byte[] arg1) throws SQLException { // TODO Auto-generated method stub } - @Override public void setBytesForBlobAtName(String arg0, byte[] arg1) throws SQLException { // TODO Auto-generated method stub @@ -341,12 +334,6 @@ public class OracleMockPreparedStatement extends MockPreparedStatement implement } - @Override - public void setDateAtName(String arg0, Date arg1, Calendar arg2) throws SQLException { - // TODO Auto-generated method stub - - } - @Override public void setDisableStmtCaching(boolean arg0) { // TODO Auto-generated method stub @@ -652,19 +639,12 @@ public class OracleMockPreparedStatement extends MockPreparedStatement implement } - @Override - public void setTimeAtName(String arg0, Time arg1, Calendar arg2) throws SQLException { - // TODO Auto-generated method stub - - } - @Override public void setTimestampAtName(String arg0, Timestamp arg1) throws SQLException { // TODO Auto-generated method stub } - @Override public void setTimestampAtName(String arg0, Timestamp arg1, Calendar arg2) throws SQLException { // TODO Auto-generated method stub @@ -736,19 +716,16 @@ public class OracleMockPreparedStatement extends MockPreparedStatement implement } - @Override public int getLobPrefetchSize() { // TODO Auto-generated method stub return 0; } - @Override public long getRegisteredQueryId() throws SQLException { // TODO Auto-generated method stub return 0; } - @Override public String[] getRegisteredTableNames() throws SQLException { // TODO Auto-generated method stub return null; @@ -765,13 +742,6 @@ public class OracleMockPreparedStatement extends MockPreparedStatement implement return false; } - @Override - public void setDatabaseChangeRegistration(DatabaseChangeRegistration arg0) throws SQLException { - // TODO Auto-generated method stub - - } - - @Override public void setLobPrefetchSize(int arg0) throws SQLException { // TODO Auto-generated method stub @@ -788,7 +758,6 @@ public class OracleMockPreparedStatement extends MockPreparedStatement implement this.rowPrefetch = rowPrefetch; } - @Override public long getChecksum() throws SQLException { // TODO Auto-generated method stub return 0; @@ -800,12 +769,6 @@ public class OracleMockPreparedStatement extends MockPreparedStatement implement return false; } - @Override - public SqlKind getSqlKind() throws SQLException { - // TODO Auto-generated method stub - return null; - } - @Override public int getcacheState() { // TODO Auto-generated method stub @@ -830,12 +793,6 @@ public class OracleMockPreparedStatement extends MockPreparedStatement implement } - @Override - public void setSnapshotSCN(long arg0) throws SQLException { - // TODO Auto-generated method stub - - } - @Override public void enterExplicitCache() throws SQLException { // TODO Auto-generated method stub @@ -872,13 +829,11 @@ public class OracleMockPreparedStatement extends MockPreparedStatement implement } - @Override public String getOriginalSql() throws SQLException { // TODO Auto-generated method stub return null; } - @Override public void setCharacterStreamAtName(String arg0, Reader arg1, int arg2) throws SQLException { // TODO Auto-generated method stub diff --git a/src/test/java/com/alibaba/druid/pool/benckmark/Oracle_Case4.java b/src/test/java/com/alibaba/druid/pool/benckmark/Oracle_Case4.java index fe51d1bc8f..444164005b 100644 --- a/src/test/java/com/alibaba/druid/pool/benckmark/Oracle_Case4.java +++ b/src/test/java/com/alibaba/druid/pool/benckmark/Oracle_Case4.java @@ -31,7 +31,7 @@ public class Oracle_Case4 extends TestCase { private String validationQuery = "SELECT 1 FROM DUAL"; private int threadCount = 1; private int loopCount = 3; - final int LOOP_COUNT = 1000 * 1000; + final int LOOP_COUNT = 1000 * 1; private boolean testOnBorrow = false; private boolean preparedStatementCache = true; private int preparedStatementCacheSize = 50; @@ -40,10 +40,10 @@ public class Oracle_Case4 extends TestCase { private String SQL; protected void setUp() throws Exception { - // jdbcUrl = "jdbc:oracle:thin:@10.20.149.85:1521:ocnauto"; - // user = "alibaba"; - // password = "ccbuauto"; - // SQL = "SELECT * FROM WP_ORDERS WHERE ID = ?"; +// jdbcUrl = "jdbc:oracle:thin:@10.20.149.85:1521:ocnauto"; +// user = "alibaba"; +// password = "ccbuauto"; +// SQL = "SELECT * FROM WP_ORDERS WHERE ID = ?"; jdbcUrl = "jdbc:oracle:thin:@10.20.149.81:1521:ointest3"; user = "alibaba"; @@ -68,7 +68,7 @@ public class Oracle_Case4 extends TestCase { dataSource.setValidationQuery(validationQuery); dataSource.setTestOnBorrow(testOnBorrow); dataSource.setConnectionProperties(properties); - dataSource.setUseOracleImplicitCache(false); + dataSource.setUseOracleImplicitCache(true); // printAV_INFO(dataSource); // printTables(dataSource); @@ -155,7 +155,7 @@ public class Oracle_Case4 extends TestCase { int mod = i % 500; - String sql = SQL; // + " AND ROWNUM <= " + (mod + 1); + String sql = SQL + " AND ROWNUM <= " + (mod + 1); PreparedStatement stmt = conn.prepareStatement(sql); stmt.setInt(1, 61); ResultSet rs = stmt.executeQuery();