From 69edb643fe6d020baa1e4c5fd16c2898df7de265 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 13 Dec 2011 15:03:09 +0800 Subject: [PATCH] ha --- .../com/alibaba/druid/filter/FilterChain.java | 2 + .../alibaba/druid/filter/FilterChainImpl.java | 4 ++ .../pool/ha/MultiDataSourceConnection.java | 13 ++--- .../ha/MultiDataSourcePreparedStatement.java | 56 +++++++++++++++++++ .../jdbc/PreparedStatementProxyImpl.java | 4 +- 5 files changed, 70 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/pool/ha/MultiDataSourcePreparedStatement.java diff --git a/src/main/java/com/alibaba/druid/filter/FilterChain.java b/src/main/java/com/alibaba/druid/filter/FilterChain.java index 5da56978f0..bfba65a8b2 100644 --- a/src/main/java/com/alibaba/druid/filter/FilterChain.java +++ b/src/main/java/com/alibaba/druid/filter/FilterChain.java @@ -52,6 +52,8 @@ import com.alibaba.druid.proxy.jdbc.StatementProxy; * @author wenshao */ public interface FilterChain { + + int getFilterSize(); FilterChain cloneChain(); diff --git a/src/main/java/com/alibaba/druid/filter/FilterChainImpl.java b/src/main/java/com/alibaba/druid/filter/FilterChainImpl.java index 18c7b0d68b..321c9b7d82 100644 --- a/src/main/java/com/alibaba/druid/filter/FilterChainImpl.java +++ b/src/main/java/com/alibaba/druid/filter/FilterChainImpl.java @@ -82,6 +82,10 @@ public class FilterChainImpl implements FilterChain { this.filterSize = getFilters().size(); } + public int getFilterSize() { + return filterSize; + } + @Override public FilterChain cloneChain() { return new FilterChainImpl(dataSource, pos); diff --git a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java index 7b1f4cd544..cde782602e 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java @@ -26,7 +26,6 @@ import com.alibaba.druid.pool.WrapperAdapter; import com.alibaba.druid.proxy.jdbc.CallableStatementProxyImpl; import com.alibaba.druid.proxy.jdbc.ConnectionProxy; import com.alibaba.druid.proxy.jdbc.DataSourceProxy; -import com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl; public class MultiDataSourceConnection extends WrapperAdapter implements Connection, ConnectionProxy { @@ -337,7 +336,7 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect PreparedStatement stmt = conn.prepareStatement(sql); long stmtId = haDataSource.createStatementId(); - return new PreparedStatementProxyImpl(this, stmt, sql, stmtId); + return new MultiDataSourcePreparedStatement(this, stmt, sql, stmtId); } @Override @@ -358,7 +357,7 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect PreparedStatement stmt = conn.prepareStatement(sql, resultSetType, resultSetConcurrency); long stmtId = haDataSource.createStatementId(); - return new PreparedStatementProxyImpl(this, stmt, sql, stmtId); + return new MultiDataSourcePreparedStatement(this, stmt, sql, stmtId); } @Override @@ -388,7 +387,7 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect PreparedStatement stmt = conn.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); long stmtId = haDataSource.createStatementId(); - return new PreparedStatementProxyImpl(this, stmt, sql, stmtId); + return new MultiDataSourcePreparedStatement(this, stmt, sql, stmtId); } @Override @@ -409,7 +408,7 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect PreparedStatement stmt = conn.prepareStatement(sql, autoGeneratedKeys); long stmtId = haDataSource.createStatementId(); - return new PreparedStatementProxyImpl(this, stmt, sql, stmtId); + return new MultiDataSourcePreparedStatement(this, stmt, sql, stmtId); } @Override @@ -419,7 +418,7 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect PreparedStatement stmt = conn.prepareStatement(sql, columnIndexes); long stmtId = haDataSource.createStatementId(); - return new PreparedStatementProxyImpl(this, stmt, sql, stmtId); + return new MultiDataSourcePreparedStatement(this, stmt, sql, stmtId); } @Override @@ -429,7 +428,7 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect PreparedStatement stmt = conn.prepareStatement(sql, columnNames); long stmtId = haDataSource.createStatementId(); - return new PreparedStatementProxyImpl(this, stmt, sql, stmtId); + return new MultiDataSourcePreparedStatement(this, stmt, sql, stmtId); } @Override diff --git a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourcePreparedStatement.java b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourcePreparedStatement.java new file mode 100644 index 0000000000..67a4c4b27b --- /dev/null +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourcePreparedStatement.java @@ -0,0 +1,56 @@ +package com.alibaba.druid.pool.ha; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import com.alibaba.druid.filter.FilterChain; +import com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl; + + +public class MultiDataSourcePreparedStatement extends PreparedStatementProxyImpl { + private MultiDataSourceConnection multiConnection; + + public MultiDataSourcePreparedStatement(MultiDataSourceConnection connection, PreparedStatement statement, String sql, long id){ + super(connection, statement, sql, id); + + multiConnection = connection; + } + + public MultiDataSourceConnection getConnection() { + return multiConnection; + } + + @Override + public boolean execute() throws SQLException { + FilterChain chain = createChain(); + + if (chain.getFilterSize() == 0) { + return this.statement.execute(); + } + + return chain.preparedStatement_execute(this); + } + + @Override + public ResultSet executeQuery() throws SQLException { + FilterChain chain = createChain(); + + if (chain.getFilterSize() == 0) { + return this.statement.executeQuery(); + } + + return chain.preparedStatement_executeQuery(this); + } + + @Override + public int executeUpdate() throws SQLException { + FilterChain chain = createChain(); + + if (chain.getFilterSize() == 0) { + return this.statement.executeUpdate(); + } + + return chain.preparedStatement_executeUpdate(this); + } +} diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java b/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java index 89a8ba89df..748794e38a 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java @@ -41,8 +41,8 @@ import java.util.Calendar; */ public class PreparedStatementProxyImpl extends StatementProxyImpl implements PreparedStatementProxy { - private final PreparedStatement statement; - private final String sql; + protected final PreparedStatement statement; + protected final String sql; public PreparedStatementProxyImpl(ConnectionProxy connection, PreparedStatement statement, String sql, long id){ super(connection, statement, id);