2012-10-19 7 views
1

Je reçois l'erreur suivante lorsque je me connecte à la base de données Apache Cassandra en utilisant le pilote CQL JDBC (cassandra-jdbc-1.1.2). J'obtiens l'erreur seulement quand j'essaye d'exécuter l'instruction UPDATE, SELECT fonctionne bien. Je peux aussi me connecter à cassandra en utilisant cqlsh.Apache Cassandra: obtenu TTransportException lors de l'utilisation de JDBC

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 

Je n'éprouvais pas ce problème lorsque j'utilisais cassandra 1.0.7. J'ai mis à jour Cassandra à la version 1.1.6, car les versions antérieures à 1.1. * Ne prennent pas en charge les instructions préparées.

Merci d'avance!

EDIT: Voici ce que j'ai dans le journal du serveur:

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) 
+0

Voyez-vous des erreurs dans les journaux Cassandra lorsque vous exécutez cela? Cette trace de pile me fait penser que quelque chose échoue côté serveur lors de l'exécution de la requête. –

+0

Vous avez raison - quelque chose ne fonctionne pas côté serveur. J'ai mis à jour la question avec la trace de la pile. –

Répondre

0

Il semble que ma question était nonsence. Voici mon code:

PreparedStatement stmt = con.prepareStatement(query); 
stmt.setLong(1, key); 
stmt.execute(query); 

query est (obiously) String. Ce qui corrigé le problème est de supprimer query de stmt.execute(query)

Je ne suis toujours pas sûr si le comportement de execute() dans un tel cas est correct.

Questions connexes