diff --git a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceStatement.java b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceStatement.java index 815e921939..5857f29b97 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceStatement.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceStatement.java @@ -423,5 +423,23 @@ public class MultiDataSourceStatement extends WrapperAdapter implements Statemen public boolean isPoolable() throws SQLException { return false; } + + @SuppressWarnings("unchecked") + @Override + public T unwrap(Class iface) throws SQLException { + if (iface == null) { + return null; + } + + if (iface.isInstance(this)) { + return (T) this; + } + + if (stmt != null) { + return stmt.unwrap(iface); + } + + return null; + } } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/ha/HADataSourceTest.java b/src/test/java/com/alibaba/druid/bvt/pool/ha/HADataSourceTest.java index 4184784509..d7c36f503c 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/ha/HADataSourceTest.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/ha/HADataSourceTest.java @@ -4,42 +4,82 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; +import junit.framework.Assert; import junit.framework.TestCase; +import com.alibaba.druid.mock.MockStatement; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.ha.HADataSource; - public class HADataSourceTest extends TestCase { + private DruidDataSource dataSourceA; private DruidDataSource dataSourceB; - - private HADataSource dataSourceHA; - + + private HADataSource dataSourceHA; + protected void setUp() throws Exception { dataSourceA = new DruidDataSource(); dataSourceA.setUrl("jdbc:mock:x1"); - + dataSourceB = new DruidDataSource(); dataSourceB.setUrl("jdbc:mock:x1"); - + dataSourceHA = new HADataSource(); dataSourceHA.addDataSource(dataSourceA); dataSourceHA.addDataSource(dataSourceB); } - + protected void tearDown() throws Exception { dataSourceHA.close(); } - - public void test_connect_close() throws Exception { + + public void test_0() throws Exception { Connection conn = dataSourceHA.getConnection(); - + Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT 1"); rs.close(); stmt.close(); + + conn.close(); + } + + public void test_1() throws Exception { + Connection conn = dataSourceHA.getConnection(); + + Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); + ResultSet rs = stmt.executeQuery("SELECT 1"); + rs.close(); + + MockStatement mockStmt = stmt.unwrap(MockStatement.class); + Assert.assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, mockStmt.getResultSetType()); + Assert.assertEquals(ResultSet.CONCUR_UPDATABLE, mockStmt.getResultSetConcurrency()); + Assert.assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, stmt.getResultSetType()); + Assert.assertEquals(ResultSet.CONCUR_UPDATABLE, stmt.getResultSetConcurrency()); + stmt.close(); + + conn.close(); + } + + public void test_2() throws Exception { + Connection conn = dataSourceHA.getConnection(); + + Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE, + ResultSet.CLOSE_CURSORS_AT_COMMIT); + ResultSet rs = stmt.executeQuery("SELECT 1"); + rs.close(); + MockStatement mockStmt = stmt.unwrap(MockStatement.class); + Assert.assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, mockStmt.getResultSetType()); + Assert.assertEquals(ResultSet.CONCUR_UPDATABLE, mockStmt.getResultSetConcurrency()); + Assert.assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, mockStmt.getResultSetHoldability()); + Assert.assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, stmt.getResultSetType()); + Assert.assertEquals(ResultSet.CONCUR_UPDATABLE, stmt.getResultSetConcurrency()); + Assert.assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, stmt.getResultSetHoldability()); + + stmt.close(); + conn.close(); } }