improve proxy performance

This commit is contained in:
wenshao
2013-01-17 01:54:44 +08:00
parent 048b6afb19
commit 9175690675
4 changed files with 351 additions and 117 deletions
@@ -26,7 +26,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.alibaba.druid.filter.FilterChain;
import com.alibaba.druid.filter.FilterChainImpl;
import com.alibaba.druid.stat.JdbcSqlStat;
@@ -51,6 +50,8 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
protected Integer updateCount = null;
private FilterChainImpl filterChain = null;
public StatementProxyImpl(ConnectionProxy connection, Statement statement, long id){
super(statement, id);
this.connection = connection;
@@ -65,8 +66,20 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
return this.statement;
}
public FilterChain createChain() {
return new FilterChainImpl(this.connection.getDirectDataSource());
public FilterChainImpl createChain() {
FilterChainImpl chain = this.filterChain;
if (chain == null) {
chain = new FilterChainImpl(this.getConnectionProxy().getDirectDataSource());
} else {
this.filterChain = null;
}
return chain;
}
public void recycleFilterChain(FilterChainImpl chain) {
chain.reset();
this.filterChain = chain;
}
@Override
@@ -81,7 +94,9 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
@Override
public void cancel() throws SQLException {
createChain().statement_cancel(this);
FilterChainImpl chain = createChain();
chain.statement_cancel(this);
recycleFilterChain(chain);
}
@Override
@@ -90,18 +105,24 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
batchSqlList = new ArrayList<String>();
}
createChain().statement_clearBatch(this);
FilterChainImpl chain = createChain();
chain.statement_clearBatch(this);
recycleFilterChain(chain);
batchSqlList.clear();
}
@Override
public void clearWarnings() throws SQLException {
createChain().statement_clearWarnings(this);
FilterChainImpl chain = createChain();
chain.statement_clearWarnings(this);
recycleFilterChain(chain);
}
@Override
public void close() throws SQLException {
createChain().statement_close(this);
FilterChainImpl chain = createChain();
chain.statement_close(this);
recycleFilterChain(chain);
}
@Override
@@ -112,7 +133,9 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
lastExecuteStartNano = -1L;
lastExecuteTimeNano = -1L;
firstResultSet = createChain().statement_execute(this, sql);
FilterChainImpl chain = createChain();
firstResultSet = chain.statement_execute(this, sql);
recycleFilterChain(chain);
return firstResultSet;
}
@@ -124,7 +147,9 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
lastExecuteStartNano = -1L;
lastExecuteTimeNano = -1L;
firstResultSet = createChain().statement_execute(this, sql, autoGeneratedKeys);
FilterChainImpl chain = createChain();
firstResultSet = chain.statement_execute(this, sql, autoGeneratedKeys);
recycleFilterChain(chain);
return firstResultSet;
}
@@ -136,7 +161,9 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
lastExecuteStartNano = -1L;
lastExecuteTimeNano = -1L;
firstResultSet = createChain().statement_execute(this, sql, columnIndexes);
FilterChainImpl chain = createChain();
firstResultSet = chain.statement_execute(this, sql, columnIndexes);
recycleFilterChain(chain);
return firstResultSet;
}
@@ -148,7 +175,9 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
lastExecuteStartNano = -1L;
lastExecuteTimeNano = -1L;
firstResultSet = createChain().statement_execute(this, sql, columnNames);
FilterChainImpl chain = createChain();
firstResultSet = chain.statement_execute(this, sql, columnNames);
recycleFilterChain(chain);
return firstResultSet;
}
@@ -159,8 +188,9 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
lastExecuteStartNano = -1L;
lastExecuteTimeNano = -1L;
int[] updateCounts = createChain().statement_executeBatch(this);
FilterChainImpl chain = createChain();
int[] updateCounts = chain.statement_executeBatch(this);
recycleFilterChain(chain);
if (updateCounts != null && updateCounts.length == 1) {
updateCount = updateCounts[0];
}
@@ -177,7 +207,10 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
lastExecuteStartNano = -1L;
lastExecuteTimeNano = -1L;
return createChain().statement_executeQuery(this, sql);
FilterChainImpl chain = createChain();
ResultSet resultSet = chain.statement_executeQuery(this, sql);
recycleFilterChain(chain);
return resultSet;
}
@Override
@@ -188,7 +221,9 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
lastExecuteStartNano = -1L;
lastExecuteTimeNano = -1L;
updateCount = createChain().statement_executeUpdate(this, sql);
FilterChainImpl chain = createChain();
updateCount = chain.statement_executeUpdate(this, sql);
recycleFilterChain(chain);
return updateCount;
}
@@ -200,7 +235,9 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
lastExecuteStartNano = -1L;
lastExecuteTimeNano = -1L;
updateCount = createChain().statement_executeUpdate(this, sql, autoGeneratedKeys);
FilterChainImpl chain = createChain();
updateCount = chain.statement_executeUpdate(this, sql, autoGeneratedKeys);
recycleFilterChain(chain);
return updateCount;
}
@@ -212,7 +249,9 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
lastExecuteStartNano = -1L;
lastExecuteTimeNano = -1L;
updateCount = createChain().statement_executeUpdate(this, sql, columnIndexes);
FilterChainImpl chain = createChain();
updateCount = chain.statement_executeUpdate(this, sql, columnIndexes);
recycleFilterChain(chain);
return updateCount;
}
@@ -224,139 +263,207 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
lastExecuteStartNano = -1L;
lastExecuteTimeNano = -1L;
updateCount = createChain().statement_executeUpdate(this, sql, columnNames);
FilterChainImpl chain = createChain();
updateCount = chain.statement_executeUpdate(this, sql, columnNames);
recycleFilterChain(chain);
return updateCount;
}
@Override
public Connection getConnection() throws SQLException {
return createChain().statement_getConnection(this);
FilterChainImpl chain = createChain();
Connection conn = chain.statement_getConnection(this);
recycleFilterChain(chain);
return conn;
}
@Override
public int getFetchDirection() throws SQLException {
return createChain().statement_getFetchDirection(this);
FilterChainImpl chain = createChain();
int value = chain.statement_getFetchDirection(this);
recycleFilterChain(chain);
return value;
}
@Override
public int getFetchSize() throws SQLException {
return createChain().statement_getFetchSize(this);
FilterChainImpl chain = createChain();
int value = chain.statement_getFetchSize(this);
recycleFilterChain(chain);
return value;
}
@Override
public ResultSet getGeneratedKeys() throws SQLException {
return createChain().statement_getGeneratedKeys(this);
FilterChainImpl chain = createChain();
ResultSet value = chain.statement_getGeneratedKeys(this);
recycleFilterChain(chain);
return value;
}
@Override
public int getMaxFieldSize() throws SQLException {
return createChain().statement_getMaxFieldSize(this);
FilterChainImpl chain = createChain();
int value = chain.statement_getMaxFieldSize(this);
recycleFilterChain(chain);
return value;
}
@Override
public int getMaxRows() throws SQLException {
return createChain().statement_getMaxRows(this);
FilterChainImpl chain = createChain();
int value = chain.statement_getMaxRows(this);
recycleFilterChain(chain);
return value;
}
@Override
public boolean getMoreResults() throws SQLException {
updateCount = null;
return createChain().statement_getMoreResults(this);
FilterChainImpl chain = createChain();
boolean value = chain.statement_getMoreResults(this);
recycleFilterChain(chain);
return value;
}
@Override
public boolean getMoreResults(int current) throws SQLException {
updateCount = null;
return createChain().statement_getMoreResults(this, current);
FilterChainImpl chain = createChain();
boolean value = chain.statement_getMoreResults(this, current);
recycleFilterChain(chain);
return value;
}
@Override
public int getQueryTimeout() throws SQLException {
return createChain().statement_getQueryTimeout(this);
FilterChainImpl chain = createChain();
int value = chain.statement_getQueryTimeout(this);
recycleFilterChain(chain);
return value;
}
@Override
public ResultSet getResultSet() throws SQLException {
return createChain().statement_getResultSet(this);
FilterChainImpl chain = createChain();
ResultSet value = chain.statement_getResultSet(this);
recycleFilterChain(chain);
return value;
}
@Override
public int getResultSetConcurrency() throws SQLException {
return createChain().statement_getResultSetConcurrency(this);
FilterChainImpl chain = createChain();
int value = chain.statement_getResultSetConcurrency(this);
recycleFilterChain(chain);
return value;
}
@Override
public int getResultSetHoldability() throws SQLException {
return createChain().statement_getResultSetHoldability(this);
FilterChainImpl chain = createChain();
int value = chain.statement_getResultSetHoldability(this);
recycleFilterChain(chain);
return value;
}
@Override
public int getResultSetType() throws SQLException {
return createChain().statement_getResultSetType(this);
FilterChainImpl chain = createChain();
int value = chain.statement_getResultSetType(this);
recycleFilterChain(chain);
return value;
}
// bug fixed for oracle
@Override
public int getUpdateCount() throws SQLException {
if (updateCount == null) {
updateCount = createChain().statement_getUpdateCount(this);
FilterChainImpl chain = createChain();
updateCount = chain.statement_getUpdateCount(this);
recycleFilterChain(chain);
}
return updateCount;
}
@Override
public SQLWarning getWarnings() throws SQLException {
return createChain().statement_getWarnings(this);
FilterChainImpl chain = createChain();
SQLWarning value = chain.statement_getWarnings(this);
recycleFilterChain(chain);
return value;
}
@Override
public boolean isClosed() throws SQLException {
return createChain().statement_isClosed(this);
FilterChainImpl chain = createChain();
boolean value = chain.statement_isClosed(this);
recycleFilterChain(chain);
return value;
}
@Override
public boolean isPoolable() throws SQLException {
return createChain().statement_isPoolable(this);
FilterChainImpl chain = createChain();
boolean value = chain.statement_isPoolable(this);
recycleFilterChain(chain);
return value;
}
@Override
public void setCursorName(String name) throws SQLException {
createChain().statement_setCursorName(this, name);
FilterChainImpl chain = createChain();
chain.statement_setCursorName(this, name);
recycleFilterChain(chain);
}
@Override
public void setEscapeProcessing(boolean enable) throws SQLException {
createChain().statement_setEscapeProcessing(this, enable);
FilterChainImpl chain = createChain();
chain.statement_setEscapeProcessing(this, enable);
recycleFilterChain(chain);
}
@Override
public void setFetchDirection(int direction) throws SQLException {
createChain().statement_setFetchDirection(this, direction);
FilterChainImpl chain = createChain();
chain.statement_setFetchDirection(this, direction);
recycleFilterChain(chain);
}
@Override
public void setFetchSize(int rows) throws SQLException {
createChain().statement_setFetchSize(this, rows);
FilterChainImpl chain = createChain();
chain.statement_setFetchSize(this, rows);
recycleFilterChain(chain);
}
@Override
public void setMaxFieldSize(int max) throws SQLException {
createChain().statement_setMaxFieldSize(this, max);
FilterChainImpl chain = createChain();
chain.statement_setMaxFieldSize(this, max);
recycleFilterChain(chain);
}
@Override
public void setMaxRows(int max) throws SQLException {
createChain().statement_setMaxRows(this, max);
FilterChainImpl chain = createChain();
chain.statement_setMaxRows(this, max);
recycleFilterChain(chain);
}
@Override
public void setPoolable(boolean poolable) throws SQLException {
createChain().statement_setPoolable(this, poolable);
FilterChainImpl chain = createChain();
chain.statement_setPoolable(this, poolable);
recycleFilterChain(chain);
}
@Override
public void setQueryTimeout(int seconds) throws SQLException {
createChain().statement_setQueryTimeout(this, seconds);
FilterChainImpl chain = createChain();
chain.statement_setQueryTimeout(this, seconds);
recycleFilterChain(chain);
}
@Override