【发布时间】:2013-12-28 02:02:45
【问题描述】:
我创建了以下模式来表示用户和一组按他们最后一条消息排序的线程之间的关联(用户已阅读哪些线程以及他未阅读哪些线程):
CREATE TABLE table(user_id bigint, message_id bigint, thread_id bigint, read boolean, PRIMARY KEY(user_id, message_id)) WITH CLUSTERING ORDER BY (message_id DESC);
CREATE INDEX ON table(read);
插入一些值后,我尝试运行此查询以获取用户最近的已读或未读线程:
SELECT thread_id, message_id FROM table WHERE user_id = ? AND message_id < ? AND read = ? LIMIT ?
如果通过 cqlsh 运行,则查询有效。但是,当通过 datastax 客户端运行时,在客户端我们会遇到超时异常,而在服务器端,Cassandra 日志会显示此异常:
ERROR [ReadStage:4190] 2013-12-10 13:18:03,579 CassandraDaemon.java (line 187) Exception in thread Thread[ReadStage:4190,5,main]
java.lang.RuntimeException: java.lang.ArrayIndexOutOfBoundsException: 0
at org.apache.cassandra.service.StorageProxy$DroppableRunnable.run(StorageProxy.java:1940)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
at org.apache.cassandra.db.filter.SliceQueryFilter.start(SliceQueryFilter.java:261)
at org.apache.cassandra.db.index.composites.CompositesSearcher.makePrefix(CompositesSearcher.java:66)
at org.apache.cassandra.db.index.composites.CompositesSearcher.getIndexedIterator(CompositesSearcher.java:101)
at org.apache.cassandra.db.index.composites.CompositesSearcher.search(CompositesSearcher.java:53)
at org.apache.cassandra.db.index.SecondaryIndexManager.search(SecondaryIndexManager.java:537)
at org.apache.cassandra.db.ColumnFamilyStore.search(ColumnFamilyStore.java:1669)
at org.apache.cassandra.db.PagedRangeCommand.executeLocally(PagedRangeCommand.java:109)
at org.apache.cassandra.service.StorageProxy$LocalRangeSliceRunnable.runMayThrow(StorageProxy.java:1423)
at org.apache.cassandra.service.StorageProxy$DroppableRunnable.run(StorageProxy.java:1936)
... 3 more
有谁知道问题出在哪里?谢谢!
【问题讨论】:
-
服务器上未处理的
RuntimeException表示服务器中存在错误,而不是代码中的错误。 -
@user3087110 您在选择查询中有一个字段在表声明中不存在(
network_id字段) -
@LyubenTodorov 你是对的,只是在这里剪切和复制代码时打错了。
-
@Raedwald 是真的,但这并不能解释为什么查询是通过 cqlsh 而不是通过 datastax 客户端工作的。
-
这里有同样的问题。传递的表中的选择导致此错误。在我更新驱动程序(我正在使用 datastax java 驱动程序 2.0.0-beta2)后,查询正在工作并停止。查询在 cqlsh 中工作。