2016-10-06 3 views
0

Я нашел проблему с библиотекой core-cassandra-драйвера, которая приводит к исключению NoHostAvailableException.Проблема выбора Cassandra QueryBuilder со статической переменной

<dependency> 
    <groupId>com.datastax.cassandra</groupId> 
    <artifactId>cassandra-driver-core</artifactId> 
    <version>3.1.0</version> 
</dependency> 

Если у вас есть статическая переменная, которая содержит столбцы, как, например:

private static final Select.SelectionOrAlias allSelection = QueryBuilder.select(). 
      column("id"). 
      column("version_id"); 

Похоже, существует проблема, когда вы resuse статической переменной с помощью конструктора запросов, например,

Select s = allSelection.from(TABLE); 
s.where(QueryBuilder.eq("id", id)). 
       and(QueryBuilder.eq("version_id", version.getVersionId())); 

ответ

0

Библиотека будет постоянно добавлять последний столбец в отборе, version_id, к переменной allSelection, которая в конечном счете приведет с запросом выбора массивного столбца, который будет разрываться на узел Кассандры, и если вы работаете кластер его в конечном итоге выведут все ваши узлы из пула доступных серверов, и любой запрос будет отклонен из-за исключения NoHostAvailable.

Возможные решения:

  1. Генерирование столбцов переменной каждый раз, когда вы используете его
  2. Просто сделайте отборное * или QueryBuilder.select()
  3. Использование подготовленных операторов (рекомендуется по соображениям производительности)

Примечание: Это происходило для меня с версией 3.0.0 и 3.1.0 библиотеки cassandra-driver-core. Не уверен в других версиях.

Смежные вопросы