I am getting the following error when I connect to the Apache Cassandra database using CQL JDBC driver (cassandra-jdbc-1.1.2). I am getting the error only when I'm trying to execute UPDATE statement, SELECTs are working fine. Also I can connect to cassandra using cqlsh.
java.sql.SQLNonTransientConnectionException: org.apache.thrift.transport.TTransportException
at org.apache.cassandra.cql.jdbc.CassandraStatement.doExecute(CassandraStatement.java:195)
at org.apache.cassandra.cql.jdbc.CassandraStatement.execute(CassandraStatement.java:203)
at com.concordusa.complete.dao.cassandra.keygen.MessageKeyGenerator.updateHighKeyInDatabase(MessageKeyGenerator.java:69)
at com.concordusa.complete.dao.cassandra.keygen.MessageKeyGenerator.getNextHighKeyValue(MessageKeyGenerator.java:44)
at com.concordusa.complete.dao.cassandra.keygen.MessageKeyGenerator.getKey(MessageKeyGenerator.java:30)
at com.concordusa.complete.dao.cassandra.keygen.MessageKeyGenerator.main(MessageKeyGenerator.java:85)
Caused by: org.apache.thrift.transport.TTransportException
at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132)
at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84)
at org.apache.thrift.transport.TFramedTransport.readFrame(TFramedTransport.java:129)
at org.apache.thrift.transport.TFramedTransport.read(TFramedTransport.java:101)
at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84)
at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:378)
at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:297)
at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:204)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:69)
at org.apache.cassandra.thrift.Cassandra$Client.recv_execute_cql_query(Cassandra.java:1402)
at org.apache.cassandra.thrift.Cassandra$Client.execute_cql_query(Cassandra.java:1388)
at org.apache.cassandra.cql.jdbc.CassandraConnection.execute(CassandraConnection.java:397)
at org.apache.cassandra.cql.jdbc.CassandraConnection.execute(CassandraConnection.java:421)
at org.apache.cassandra.cql.jdbc.CassandraStatement.doExecute(CassandraStatement.java:161)
... 5 more
I wasn't experiencing this problem when I was using cassandra 1.0.7. I updated cassandra to 1.1.6 because versions prior to 1.1.* do not support prepared statements.
Thanks in advance!
EDIT: Here's what I have in the server log:
ERROR [Thrift:13] 2012-10-23 14:50:24,327 CustomTThreadPoolServer.java (line 204) Error occurred during processing of message.
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at org.apache.cassandra.cql.Term.getByteBuffer(Term.java:102)
at org.apache.cassandra.cql.UpdateStatement.mutationForKey(UpdateStatement.java:206)
at org.apache.cassandra.cql.UpdateStatement.prepareRowMutations(UpdateStatement.java:166)
at org.apache.cassandra.cql.UpdateStatement.prepareRowMutations(UpdateStatement.java:130)
at org.apache.cassandra.cql.QueryProcessor.batchUpdate(QueryProcessor.java:256)
at org.apache.cassandra.cql.QueryProcessor.processStatement(QueryProcessor.java:596)
at org.apache.cassandra.cql.QueryProcessor.process(QueryProcessor.java:879)
at org.apache.cassandra.thrift.CassandraServer.execute_cql_query(CassandraServer.java:1240)
at org.apache.cassandra.thrift.Cassandra$Processor$execute_cql_query.getResult(Cassandra.java:3542)
at org.apache.cassandra.thrift.Cassandra$Processor$execute_cql_query.getResult(Cassandra.java:3530)
at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:32)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:34)
at org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:186)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
It seems that my question was nonsence. Here's my code:
PreparedStatement stmt = con.prepareStatement(query);
stmt.setLong(1, key);
stmt.execute(query);
query
is (obiously) String. What fixed the problem is removing query
from stmt.execute(query)
I'm still not sure if the behavior of execute()
in such a case is correct.