Author: jbellis Date: Wed Oct 5 19:51:10 2011 New Revision: 1179399 URL: http://svn.apache.org/viewvc?rev=1179399&view=rev Log: remove statements from connection's list, when closed manually patch by Rick Shaw; reviewed by Patricio Echague and jbellis for CASSANDRA-3244
Modified: cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraConnection.java cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraStatement.java Modified: cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraConnection.java URL: http://svn.apache.org/viewvc/cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraConnection.java?rev=1179399&r1=1179398&r2=1179399&view=diff ============================================================================== --- cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraConnection.java (original) +++ cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraConnection.java Wed Oct 5 19:51:10 2011 @@ -20,51 +20,17 @@ */ package org.apache.cassandra.cql.jdbc; -import static org.apache.cassandra.cql.jdbc.Utils.ALWAYS_AUTOCOMMIT; -import static org.apache.cassandra.cql.jdbc.Utils.BAD_TIMEOUT; -import static org.apache.cassandra.cql.jdbc.Utils.NO_INTERFACE; -import static org.apache.cassandra.cql.jdbc.Utils.NO_TRANSACTIONS; -import static org.apache.cassandra.cql.jdbc.Utils.PROTOCOL; -import static org.apache.cassandra.cql.jdbc.Utils.SCHEMA_MISMATCH; -import static org.apache.cassandra.cql.jdbc.Utils.TAG_SERVER_NAME; -import static org.apache.cassandra.cql.jdbc.Utils.TAG_DATABASE_NAME; -import static org.apache.cassandra.cql.jdbc.Utils.TAG_PASSWORD; -import static org.apache.cassandra.cql.jdbc.Utils.TAG_PORT_NUMBER; -import static org.apache.cassandra.cql.jdbc.Utils.TAG_USER; -import static org.apache.cassandra.cql.jdbc.Utils.WAS_CLOSED_CON; -import static org.apache.cassandra.cql.jdbc.Utils.createSubName; -import static org.apache.cassandra.cql.jdbc.Utils.determineCurrentKeyspace; - -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.PreparedStatement; -import java.sql.SQLClientInfoException; -import java.sql.SQLException; -import java.sql.SQLFeatureNotSupportedException; -import java.sql.SQLInvalidAuthorizationSpecException; -import java.sql.SQLNonTransientConnectionException; -import java.sql.SQLRecoverableException; -import java.sql.SQLSyntaxErrorException; -import java.sql.SQLTimeoutException; -import java.sql.SQLTransientConnectionException; -import java.sql.SQLWarning; -import java.sql.Statement; -import java.util.ArrayList; +import java.sql.*; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; +import java.util.concurrent.ConcurrentSkipListSet; -import org.apache.cassandra.thrift.AuthenticationException; -import org.apache.cassandra.thrift.AuthenticationRequest; -import org.apache.cassandra.thrift.AuthorizationException; -import org.apache.cassandra.thrift.Cassandra; -import org.apache.cassandra.thrift.Compression; -import org.apache.cassandra.thrift.CqlResult; -import org.apache.cassandra.thrift.InvalidRequestException; -import org.apache.cassandra.thrift.SchemaDisagreementException; -import org.apache.cassandra.thrift.TimedOutException; -import org.apache.cassandra.thrift.UnavailableException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.cassandra.thrift.*; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; @@ -72,8 +38,7 @@ import org.apache.thrift.transport.TFram import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static org.apache.cassandra.cql.jdbc.Utils.*; /** * Implementation class for {@link Connection}. @@ -99,9 +64,9 @@ class CassandraConnection extends Abstra private Properties clientInfo = new Properties(); /** - * List of all Statements that have been created by this connection + * Set of all Statements that have been created by this connection */ - private List<Statement> statements; + private Set<Statement> statements = new ConcurrentSkipListSet<Statement>(); private Cassandra.Client client; private TTransport transport; @@ -119,7 +84,6 @@ class CassandraConnection extends Abstra */ public CassandraConnection(Properties props) throws SQLException { - statements = new ArrayList<Statement>(); clientInfo = new Properties(); url = PROTOCOL + createSubName(props); try @@ -202,10 +166,13 @@ class CassandraConnection extends Abstra */ public synchronized void close() throws SQLException { + // close all statements associated with this connection upon close + for (Statement statement : statements) + statement.close(); + statements.clear(); + if (isConnected()) { - // spec says to close all statements associated with this connection upon close - for (Statement statement : statements) statement.close(); // then disconnect from the transport disconnect(); } @@ -220,22 +187,25 @@ class CassandraConnection extends Abstra public Statement createStatement() throws SQLException { checkNotClosed(); - statements.add(new CassandraStatement(this)); - return statements.get(statements.size() - 1); + Statement statement = new CassandraStatement(this); + statements.add(statement); + return statement; } public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { checkNotClosed(); - statements.add(new CassandraStatement(this, null, resultSetType, resultSetConcurrency)); - return statements.get(statements.size() - 1); + Statement statement = new CassandraStatement(this, null, resultSetType, resultSetConcurrency); + statements.add(statement); + return statement; } public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkNotClosed(); - statements.add(new CassandraStatement(this, null, resultSetType, resultSetConcurrency, resultSetHoldability)); - return statements.get(statements.size() - 1); + Statement statement = new CassandraStatement(this, null, resultSetType, resultSetConcurrency, resultSetHoldability); + statements.add(statement); + return statement; } public boolean getAutoCommit() throws SQLException @@ -327,8 +297,9 @@ class CassandraConnection extends Abstra public PreparedStatement prepareStatement(String sql) throws SQLException { checkNotClosed(); - statements.add(new CassandraPreparedStatement(this, sql)); - return (PreparedStatement) statements.get(statements.size() - 1); + PreparedStatement statement = new CassandraPreparedStatement(this, sql); + statements.add(statement); + return statement; } public PreparedStatement prepareStatement(String arg0, int arg1, int arg2) throws SQLException @@ -442,6 +413,14 @@ class CassandraConnection extends Abstra } /** + * Remove a Statement from the Open Statements List + */ + protected boolean removeStatement(Statement statement) + { + return statements.remove(statement); + } + + /** * Shutdown the remote connection */ protected void disconnect() Modified: cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraStatement.java URL: http://svn.apache.org/viewvc/cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraStatement.java?rev=1179399&r1=1179398&r2=1179399&view=diff ============================================================================== --- cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraStatement.java (original) +++ cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraStatement.java Wed Oct 5 19:51:10 2011 @@ -34,7 +34,6 @@ import java.sql.SQLSyntaxErrorException; import java.sql.SQLTransientConnectionException; import java.sql.SQLWarning; import java.sql.Statement; -import java.util.regex.Pattern; import org.apache.cassandra.thrift.CqlResult; import org.apache.cassandra.thrift.InvalidRequestException; @@ -143,10 +142,11 @@ class CassandraStatement extends Abstrac public void close() throws SQLException { + connection.removeStatement(this); connection = null; cql = null; } - + private void doExecute(String sql) throws SQLException { try