diff --git a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java index 184910fbf0..1185b2b2d5 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java @@ -18,6 +18,7 @@ package com.alibaba.druid.filter.stat; import java.sql.SQLException; import java.sql.Savepoint; import java.util.Date; +import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentMap; @@ -50,6 +51,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { public final static String ATTR_SQL = "stat.sql"; public final static String ATTR_UPDATE_COUNT = "stat.updteCount"; + public final static String ATTR_TRANSACTION = "stat.tx"; protected JdbcDataSourceStat dataSourceStat; @@ -91,6 +93,26 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { } this.dataSourceStat = stat; } + + @Override + public void connection_setAutoCommit(FilterChain chain, ConnectionProxy connection, boolean autoCommit) + throws SQLException { + Map attributes = connection.getAttributes(); + + if (!autoCommit) { + TransactionInfo transInfo = (TransactionInfo) attributes.get(ATTR_TRANSACTION); + if (transInfo == null) { + long transactionId = connection.getDirectDataSource().createTransactionId(); + transInfo = new TransactionInfo(transactionId); + attributes.put(ATTR_TRANSACTION, transInfo); + dataSourceStat.getConnectionStat().incrementConnectionCommitCount(); + } + } else { + attributes.remove(ATTR_TRANSACTION); + } + + chain.connection_setAutoCommit(connection, autoCommit); + } public ConnectionProxy connection_connect(FilterChain chain, Properties info) throws SQLException { ConnectionProxy connection = null; @@ -154,14 +176,27 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { @Override public void connection_commit(FilterChain chain, ConnectionProxy connection) throws SQLException { super.connection_commit(chain, connection); + + handleEndTransaction(connection); connectStat.incrementConnectionCommitCount(); dataSourceStat.getConnectionStat().incrementConnectionCommitCount(); } + private void handleEndTransaction(ConnectionProxy connection) { + Map attributes = connection.getAttributes(); + + TransactionInfo transInfo = (TransactionInfo) attributes.remove(ATTR_TRANSACTION); + if (transInfo != null) { + transInfo.setEndTimeMillis(System.currentTimeMillis()); + } + } + @Override public void connection_rollback(FilterChain chain, ConnectionProxy connection) throws SQLException { super.connection_rollback(chain, connection); + + handleEndTransaction(connection); connectStat.incrementConnectionRollbackCount(); dataSourceStat.getConnectionStat().incrementConnectionRollbackCount(); @@ -173,6 +208,8 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { public void connection_rollback(FilterChain chain, ConnectionProxy connection, Savepoint savepoint) throws SQLException { super.connection_rollback(chain, connection, savepoint); + + handleEndTransaction(connection); connectStat.incrementConnectionRollbackCount(); dataSourceStat.getConnectionStat().incrementConnectionRollbackCount(); diff --git a/src/test/java/com/alibaba/druid/pool/ui/DruidDataSourceUIManager.java b/src/test/java/com/alibaba/druid/pool/ui/DruidDataSourceUIManager.java index bf615699f9..97233723b2 100644 --- a/src/test/java/com/alibaba/druid/pool/ui/DruidDataSourceUIManager.java +++ b/src/test/java/com/alibaba/druid/pool/ui/DruidDataSourceUIManager.java @@ -47,7 +47,7 @@ public class DruidDataSourceUIManager extends JFrame { private JScrollPane scrollPane = new JScrollPane(mainPanel); private JLabel lbUrl = new JLabel("URL : "); - private JTextField txtUrl = new JTextField("jdbc:mock:"); + private JTextField txtUrl = new JTextField("jdbc:oracle:thin:@10.20.36.18:1521:ocndb"); private JLabel lbDriverClass = new JLabel("DriverClassName : "); private JTextField txtDriverClass = new JTextField(); @@ -63,16 +63,16 @@ public class DruidDataSourceUIManager extends JFrame { private JTextField txtConnectionProperties = new JTextField(); private JLabel lbInitialSize = new JLabel("InitialSize : "); - private JTextField txtInitialSize = new JTextField("0"); + private JTextField txtInitialSize = new JTextField("1"); private JLabel lbMaxActive = new JLabel("MaxActive : "); - private JTextField txtMaxActive = new JTextField("8"); + private JTextField txtMaxActive = new JTextField("14"); private JLabel lbMaxIdle = new JLabel("MaxIdle : "); - private JTextField txtMaxIdle = new JTextField("8"); + private JTextField txtMaxIdle = new JTextField("14"); private JLabel lbMinIdle = new JLabel("MinIdle : "); - private JTextField txtMinIdle = new JTextField("0"); + private JTextField txtMinIdle = new JTextField("1"); private JLabel lbMaxWait = new JLabel("MaxWait : "); private JTextField txtMaxWait = new JTextField("-1"); @@ -423,7 +423,7 @@ public class DruidDataSourceUIManager extends JFrame { try { Statement stmt = conn.createStatement(); stmt.setQueryTimeout(5); - ResultSet rs = stmt.executeQuery("SELECT 1"); + ResultSet rs = stmt.executeQuery("SELECT 1 FROM DUAL"); while (rs.next()) { rs.getObject(1); } @@ -484,6 +484,9 @@ public class DruidDataSourceUIManager extends JFrame { dataSource.setMinEvictableIdleTimeMillis(Integer.parseInt(txtMinEvictableIdleTimeMillis.getText().trim())); dataSource.setTestWhileIdle(Boolean.parseBoolean(txtTestWhileIdle.getText().trim())); dataSource.setTestOnBorrow(Boolean.parseBoolean(txtTestOnBorrow.getText().trim())); + + dataSource.setTimeBetweenEvictionRunsMillis(60000); + dataSource.setNumTestsPerEvictionRun(20); try { Connection conn = dataSource.getConnection(); @@ -556,9 +559,9 @@ public class DruidDataSourceUIManager extends JFrame { Runnable task = new Runnable() { public void run() { - final int threadCount = 10; - final int LOOP_COUNT = 1000 * 10; - final String sql = "SELECT 1"; + final int threadCount = 20; + final int LOOP_COUNT = 1000 * 1; + final String sql = "SELECT 1 FROM DUAL"; final CountDownLatch startLatch = new CountDownLatch(1); final CountDownLatch endLatch = new CountDownLatch(threadCount); for (int i = 0; i < threadCount; ++i) { diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java index 6e80660a58..6db56f6331 100644 --- a/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java @@ -20,7 +20,7 @@ public class OracleSQLParserResourceTest extends TestCase { // String resource = "bvt/parser/oracle-" + i + ".txt"; // exec_test(resource); // } - exec_test("bvt/parser/oracle-54.txt"); + exec_test("bvt/parser/oracle-55.txt"); } public void exec_test(String resource) throws Exception { diff --git a/src/test/java/com/alibaba/druid/stat/TestOracle.java b/src/test/java/com/alibaba/druid/stat/TestOracle.java index 33949d44bd..045a85a85f 100644 --- a/src/test/java/com/alibaba/druid/stat/TestOracle.java +++ b/src/test/java/com/alibaba/druid/stat/TestOracle.java @@ -16,18 +16,23 @@ package com.alibaba.druid.stat; import java.sql.Connection; +import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.PreparedStatement; +import java.sql.ResultSet; import junit.framework.TestCase; +import com.alibaba.druid.util.JdbcUtils; + public class TestOracle extends TestCase { public void test_0() throws Exception { String url = "jdbc:oracle:thin:@10.20.144.80:1521:orcl"; Class.forName("oracle.jdbc.driver.OracleDriver"); - Connection conn = DriverManager.getConnection(url, "druid", "druid123"); + Connection conn = DriverManager.getConnection(url, "DRUID", "DRUID"); + conn.setAutoCommit(false); PreparedStatement stmt = conn.prepareStatement("select sysdate"); stmt.executeBatch(); diff --git a/src/test/resources/bvt/parser/oracle-55.txt b/src/test/resources/bvt/parser/oracle-55.txt new file mode 100755 index 0000000000..74412339b4 --- /dev/null +++ b/src/test/resources/bvt/parser/oracle-55.txt @@ -0,0 +1,9 @@ +UPDATE company_approved SET gmt_modified = NULL WHERE ID = ?; +--------------------------- +UPDATE company_approved +SET gmt_modified = NULL +WHERE ID = ?; +--------------------------- +UPDATE company_approved +SET gmt_modified = ? +WHERE ID = ?; \ No newline at end of file diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties index 64b595c698..8f0ecd1926 100644 --- a/src/test/resources/log4j.properties +++ b/src/test/resources/log4j.properties @@ -27,6 +27,6 @@ log4j.category.java.sql.ResultSet=DEBUG log4j.category.org.codehaus.xfire=INFO log4j.category.httpclient=INFO log4j.category.org.apache.struts.action.ActionServlet=ERROR -log4j.category.com.alibaba.druid.mock=ERROR +log4j.category.com.alibaba.druid.mock=DEBUG log4j.rootLogger=TRACE,CONSOLE