Java-запросы к PGPool II вызывают ошибки «безымянный подготовленный оператор не существует»

У меня есть приложение Java, использующее базу данных Postgres, и я пытаюсь внедрить PGPool. для увеличения моей базы данных. Я столкнулся с проблемой, когда Postgres выдает следующую ошибку: безымянный подготовленный оператор не существует.После запуска ведения журнала в Postgres я вижу следующие вещи, происходящие для каждого оператора select, выполняемого моим приложением:

EDTLOG:  00000: duration: 7.585 ms  parse : "my select statement here"
EDTLOG:  00000: duration: 0.088 ms  bind : "my select statement here"
EDTLOG:  00000: duration: 79.014 ms  execute : "my select statement here"

Но иногда между этапами синтаксического анализа/связывания/выполнения PGPool выполняет некоторые дополнительные запросы, так что журнал выглядит следующим образом:

EDTLOG:  00000: duration: 7.585 ms  parse : "my select statement here"
EDTLOG:  00000: duration: 0.088 ms  bind : "my select statement here"
EDTLOG:  00000: duration: 0.328 ms  statement: SELECT count(*) FROM pg_class AS c, pg_namespace AS n WHERE c.relname = 'my_table' AND c.relnamespace = n.oid AND n.nspname = 'pg_catalog'
EDTLOG:  00000: duration: 79.014 ms  execute : "my select statement here"
EDTERROR:  26000: unnamed prepared statement does not exist
EDTLOG:  00000: duration: 0.022 ms  parse S_2: ROLLBACK
EDTLOG:  00000: duration: 0.005 ms  bind S_2: ROLLBACK
EDTLOG:  00000: duration: 0.008 ms  execute S_2: ROLLBACK

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

Моей первой мыслью было, что, возможно, моему Java-приложению не нужно отправлять инструкции parse/bind/execute для каждого запроса. Но похоже, что это поведение по умолчанию для драйвера JDBC Postgres, начиная с JDBC версии 3 и Postgres 7.4 http://jdbc.postgresql.org/documentation/head/server-prepare.html. Я полагаю, что мог бы попробовать полностью отключить подготовленные операторы на стороне сервера, но в документации не указано, как это сделать, и я не уверен, что хочу это делать в любом случае.

Моя вторая мысль заключалась в том, чтобы заставить PGPool II прекратить отправку этих запросов метаданных. Поскольку я просто пытаюсь использовать PGPool в качестве балансировщика нагрузки, я действительно не понимаю, зачем ему знать все о метаданных моей таблицы. Я отследил код, выполняющий эти запросы, в методе is_system_catalog источника PGPool здесь: https://github.com/iakio/pgpool-II/blob/master/pool_select_walker.c#L256Кажется, что PGPool по какой-то причине хочет знать о моих связях между таблицами, и, к сожалению, я не вижу способа отключить это поведение.

Будем признательны за любую информацию о том, как обойти эту проблему.

Немного информации о моей среде:

JDBC Driver: postgresql-9.1-901.jdbc4.jar
Java version "1.6.0_31"
Spring 3.1 managed JPA 
Hibernate 3.5
Postgres 9.1

ОБНОВЛЕНИЕ: Я нашел обходной путь к проблеме. Размещение protocolVersion=2в URL-адресе JDBC фактически указывает драйверу JDBC Postgres не использовать подготовленные операторы на стороне сервера. Это позволяет моему приложению работать при использовании PGPool II перед моей базой данных. Меня беспокоит тот факт, что мне приходится возвращаться к протоколу JDBC версии 2 только для того, чтобы использовать PGPool.

12
задан Mark B 15 March 2012 в 19:35
поделиться