Java, пул соединений JDBC, откат соединения JDBC - PullRequest
0 голосов
/ 21 июля 2011

У нас есть пул соединений с базой данных (java JDBC). Каждый раз, когда мы оформляем заказ, мы сначала делаем упреждающий откат подключения, чтобы избежать исключений подключения. Пожалуйста, игнорируйте бизнес-кейс. С технической точки зрения, сильно ли откат JDBC-соединения сильно влияет на производительность приложения (поскольку наше приложение - это бизнес за несколько секунд)?

Ответы [ 4 ]

2 голосов
/ 21 июля 2011

Нет такой вещи, как откат соединения. Возможно, вы имели в виду откат транзакции. Вы никогда не должны откатываться, если не собираетесь потерять какие-либо изменения, сделанные в базе данных в транзакции, и вы никогда не должны фиксировать, если вы не собираетесь фиксировать все изменения, сделанные в транзакции.

Сказав это, я не понимаю термина «мы сначала делаем упреждающий откат подключения, чтобы избежать исключений при подключении», и почему вы будете это делать в первую очередь. Предполагая, что вы имеете в виду вызов метода Connection.rollback(), я бы посчитал это плохой практикой. Фактически это приведет к потере производительности, поскольку требует сетевого вызова и вынуждает базу данных отбрасывать состояние связанной транзакции (что в этом сценарии не имеет смысла, поскольку еще не было выполнено никакой работы).

Если вы намереваетесь избежать исключений, связанных с мертвым соединением, полученным из пула соединений, вы должны сконфигурировать пул, чтобы проверить, не устарело ли соединение (обычно с помощью выполнения оператора SQL теста), прежде чем возвращать соединение с приложением. После того как приложение установило соединение, оно не должно сохранять соединение после того, как оно ему больше не нужно; в идеале приложение должно возвращать соединение с пулом. Если вы обнаружите, что храните объект соединения, базовое физическое соединение недоступно для использования другими запросами, и оно может быть фактически закрыто брандмауэром, настроенным на закрытие соединений, которые были активны после определенной продолжительности.

2 голосов
/ 21 июля 2011

Я не понимаю, почему соединения, поступающие напрямую из пула соединений, необходимо откатывать.Их состояние должно быть бездействующим, иначе вы не сможете получить их из пула?!

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

Так что, если ваше приложение критично ко времени - вы должны потратить некоторое время на оптимизацию кода,Используйте транзакции только там, где это необходимо.

1 голос
/ 21 июля 2011

Надлежащий способ проверки соединения, поступающего из пула, - это использование запроса проверки .Если откат произошел из-за того, что кто-то боится, что в пул может быть возвращено «грязное» соединение, вам необходимо использовать среду управления реальными ресурсами .

1 голос
/ 21 июля 2011

Полностью согласен с маной.

Вы «извлекаете» соединение из пула, затем работаете с ним, а затем возвращаете его в пул, как только закончите.

Пожалуйста, ознакомьтесь с логикой JBoss Connection Pooling или просто воспользуйтесь пакетом пула соединений промышленного уровня.

Обсуждается на Опции пула соединений с JDBC: DBCP против C3P0

...