Нет комментария балансировки нагрузки в Java Hibernate Query

Мы используем pgPool в нашем проекте Java для балансировки нагрузки в нашей базе данных Postgres.

pgPool отправляет запросы только для чтения на подчиненные серверы и запросы на запись на главный. Все в порядке.

Но в нашем приложении есть очень специфические случаи, когда нам нужно, чтобы запрос выполнялся только на главном сервере.

pgPool предоставляет следующий механизм:

/*NO LOAD BALANCE*/ SELECT * FROM user;

Приведенный выше запрос всегда будет выполняться на главном сервере.

Я много искал, но хотя можно установить комментарий в ручном запросе (в классе Query есть setComment()), я не смог найти способ сделать это, используя репозиторий Hibernate с запросами, созданными из имен методов.

Пример:

public interface UserRepository extends Repository<User, Long> {
    List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

Как поместить комментарий в этот запрос?


person computeiro    schedule 09.09.2016    source источник
comment
Вы, скорее всего, не можете.   -  person Kayaman    schedule 09.09.2016
comment
Да... Я много читал и пришел к такому же выводу. Также невозможно поместить комментарий в запрос HQL (язык запросов Hibernate).   -  person computeiro    schedule 09.09.2016
comment
Учитывая, что это низкоуровневый нестандартный механизм, неудивительно, что фреймворки более высокого уровня не поддерживают его.   -  person Kayaman    schedule 09.09.2016


Ответы (1)


Ну, это не отвечает на исходный вопрос, но я решил проблему, используя другой подход.

Я нашел решение, прочитав этот раздел документации pgPool: http://www.pgpool.net/docs/latest/pgpool-en.html#condition_for_load_balance

Таким образом, аннотирование метода или класса Java с помощью @Transactional позволяет достичь желаемого результата маршрутизации запросов на главный сервер.

При использовании этой аннотации pgPool будет направлять все запросы, сделанные после запроса WRITE (включая), на главный сервер Postgres.

Если у вас нет запроса WRITE, вы можете добиться результата, аннотировав @Transactional(isolation=Isolation.SERIALIZABLE) - при использовании Spring. Но имейте в виду, что этот уровень изоляции является самым строгим из доступных.

person computeiro    schedule 09.09.2016