Цикл Java-драйвера DataStax, повторяющий строки

Я разрабатываю новый продукт, используя cassandra в качестве БД. Прямо сейчас установлен на одном ноутбуке для разработки Ubuntu 13.10 с ядром i7. У меня есть семейство столбцов и запрос. Этот запрос, выполненный в cqlsh, дает 33267 строк. Выполненный в моей java-программе с использованием java-драйвера datastax 2.0, некоторые выполнения дают правильные строки, другие попали в бесконечный цикл, снова и снова повторяя одни и те же строки:

while (!rs.isExhausted()) {
  Row row = rs.one();
  long hora = row.getDate(1).getTime();
  String clave = row.getString(0);
  List<Long> data = row.getList(2, Long.class);
  ordenados.put(hora, new Object[]{clave, data.get(0) / 100000000.0, data.get(1)});
  contador2 +=1;
  if (Math.floor(contador2/1000.0) == contador2/1000.0) {
    System.out.println("sitio "+ contador2+ " "+clave+ " "+hora);
  }
}

При профилировании приложения я вижу конфликт блокировок между новыми рабочими потоками ввода-вывода, 98% времени тратится на метод sun.nio.ch.EPollArrayWrapper.poll. Кто-то сталкивался с этой проблемой и знает решение? Кто-нибудь может мне указать ссылку для загрузки cassandra-driver-core-2.0.0.src.jar, чтобы я мог отладить ошибку с источниками и сообщить в datastax? Это захватывающая технология, но впервые в моей карьере производственная БД дает мне такое ненадежное поведение. Кстати: в исходном запросе был порядок, который я удалил. С заказом я получил это исключение: Исключение в потоке «основной» com.datastax.driver.core.exceptions.InvalidQueryException: не удается выполнить запросы страниц как с ORDER BY, так и с ограничением IN для ключа раздела; надо либо убрать ORDER BY или IN и сортировать на стороне клиента, либо отключить пейджинг для этого запроса Когда вчера работал на похожих запросах и на cqlsh работает без проблем с порядком по добавленным. Я просто говорю об этой проблеме, потому что, возможно, оба связаны. С уважением


person Rogelio Triviño    schedule 13.03.2014    source источник


Ответы (1)


Вы можете получить исходный код из gitib datastax/java-driver. Не похоже, что исходный код включен ни в загрузку maven, ни в tarball.

Я думаю, вы столкнулись с CASSANDRA-6722, когда использовали IN и ORDER BY в своем запрос. Драйвер java автоматически выполняет подкачку с размером выборки по умолчанию 5000. Вы можете отключить автоматическую подкачку с помощью Statement.setFetchSize(Integer.MAX_VALUE). Дополнительную информацию об автоматической подкачке страниц можно найти в этом сообщении в блоге. .

К какой версии Cassandra подключается ваше приложение? Если бы вы могли рассказать больше об определении таблицы и запросе, возможно, удастся воспроизвести проблему с повторяющимися строками.

person djatnieks    schedule 16.03.2014
comment
Спасибо за ваш ответ. Я использую cassandra 2.0.6 на Ubuntu 13.10. Я читал больше об автоматическом пейджинге, и его отключение помогло: `//ResultSet rs= cassandra.execute(query); Оператор stmt = новый SimpleStatement (запрос); stmt.setFetchSize (Целое число.MAX_VALUE); ResultSet rs = cassandra.execute(stmt); в то время как (!rs.isExhausted()) { ` - person Rogelio Triviño; 18.03.2014