Постгрес пл / ява
Я бы очень предпочел написание кода на стороне БД на Java, но хотел бы знать, если у этого есть какие-либо недостатки по сравнению с pl/pgsql (особенно связанные с производительностью и обработкой ошибок).
2 ответа
Насколько я знаю, у pl/java есть несколько серьезных проблем:
- Его сложно установить на сервер postgresql. Даже если вы найдете бинарную сборку для вашей версии postgresql (что тоже сложно) - она требует некоторой настройки и перемещения по пути к библиотеке.
- Первый вызов хранимой процедуры Java приведет к новому процессу JVM. Процессы JVM находятся в области соединений и требуют некоторого объема памяти для кучи Java, поэтому, если вы используете пул соединений, вы в конечном итоге получите 10-20 JVM, запущенных и неиспользуемых большую часть времени, что потребляет оперативную память вашего сервера
- pl/java может связываться с базой данных postgresql, используя самодельный драйвер JDBC, который эмулирует обычное использование JDBC, но имеет некоторые проблемы с реализацией, которые могут вас удивить. Особенно, если вы хотите использовать ошибки JDBC или другие не очень распространенные вещи.
- Ведение журнала pl/java довольно специфично - это связано с внутренней обработкой ошибок postgresql. Например, если вы регистрируете что-либо с помощью API-интерфейса java logging на уровне журнала ERROR, это приведет к разрыву соединения с вашим сервером.
- У pl/java очень хорошая производительность обработки данных по сравнению с java-логикой на основе сервера приложений, но она абсолютно не масштабируема - процедуры pl/java полностью однопоточные - postgresql запрещает многопоточные процедуры
- Если вы используете внутренний драйвер JDBC и ваш оператор SQL содержит ошибки - вы получите загадочное сообщение об ошибке в журнале postgresql - совершенно не связанное с реальной проблемой.
Как результат - вы можете использовать pl/java-процедуры с некоторым успехом, но вы должны делать это очень осторожно и, возможно, вам нужно подумать об улучшении дизайна вашего приложения.
Обычно единственное существенное отличие заключается в поездках в оба конца. Если ваш Java-код имеет подключение с низкой задержкой к БД, вы должны найти клиентскую логику, которая будет работать достаточно хорошо.
Обновление: Ян говорит, что вы имеете в виду PL/Java, то есть выполнение в базе данных. Если это то, что вы имели в виду, я бы не рекомендовал PL/Java. Это почти не поддерживается; Кроме того, модель Java (тяжелые потоки, большой дорогой запуск) не очень подходит для PostgreSQL (процессы, а не потоки, очень легкий запуск).
Было бы здорово, если бы люди посвятили свою работу PL/Java, но сейчас ничего особенного не происходит.