Сколько соединений JDBC в Java?

У меня есть программа на Java, состоящая примерно из 15 методов. И эти методы очень часто вызываются во время выполнения программы. На данный момент я создаю новое соединение в каждом методе и вызываю для них операторы (база данных настроена на другом компьютере в сети).

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

Я подозреваю, что я не очень эффективно использую ресурсы с текущим дизайном, и есть много возможностей для улучшения, учитывая, что эта программа может значительно расшириться в будущем.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
18
0
27 551
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Для этого вам следует использовать пул соединений.

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

Если другой поток хочет новое соединение и оно уже используется, можно создать новое. Если никакой другой поток не использует соединение, его можно использовать повторно.

Таким образом, вы можете каким-то образом оставить свое приложение таким, какое оно есть (и не передавать соединение со всех сторон), и при этом правильно использовать ресурсы.

К сожалению, пулы соединений первого класса не очень просты в использовании в автономных приложениях (они используются по умолчанию на серверах приложений). Вероятно, микроконтейнер (например, Sping) или хороший фреймворк (например, Hibernate) могут позволить вам его использовать.

Однако их несложно запрограммировать с нуля.

:)

Этот поиск Google поможет вам узнать больше о том, как его использовать.

Пролистать

если «списание» подключений не рассматривается; Зачем нам нужно несколько подключений? одно единственное соединение может использоваться везде rit; поскольку объекты операторов всегда разные? Когда нам требуется множественное подключение в приложении?

Kanagavelu Sugumar 17.09.2012 22:11

Вы можете либо передать соединение, либо еще лучше использовать что-то вроде Jakarta Database Connection Pooling. http://commons.apache.org/dbcp/

Ответ принят как подходящий

Да, вам следует подумать о повторном использовании подключений, а не создавать каждый раз новое. Обычная процедура:

  • предположите, сколько одновременных подключений ваша база данных может разумно обрабатывать (например, начните с 2 или 3 на процессор на машине базы данных, пока не обнаружите, что их слишком мало или слишком много - это будет зависеть от того, как диск -связанные ваши запросы)
  • создать бассейн из этого количества соединений: по сути, класс, который вы можете запросить «следующее бесплатное соединение» в начале каждого метода, а затем «передать обратно» пулу в конце каждого метода
  • ваш метод getFreeConnection () должен возвращать бесплатное соединение, если оно доступно, иначе либо (1) создайте новое, до максимального количества подключений, которое вы решили разрешить, либо (2) если максимальное количество уже создано , подождите, пока один станет свободным
  • Я бы порекомендовал класс Semaphore для управления соединениями; У меня на самом деле есть небольшая статья на моем веб-сайте по управление пулом ресурсов с помощью семафора с примером, который, я думаю, вы могли бы приспособить к своей цели.

Пара практических соображений:

  • Для оптимальной производительности нужно быть осторожным не "перебивать" соединение, пока вы на самом деле не используете его для выполнения запроса. Если вы берете соединение из пула один раз, а затем передаете его различным методам, вам нужно убедиться, что вы не делаете это случайно.
  • Не забудьте вернуть свои соединения в пул! (попробуй / наконец-то здесь твой друг ...)
  • Во многих системах вы не может держать связи открытыми "вечно": операционная система закроет их через некоторое максимальное время. Таким образом, в вашем методе «вернуть соединение с пулом» вам нужно подумать о «уходящие на пенсию» связи, которые существуют уже давно (встроить некоторый механизм для запоминания, например, имея объект-оболочка вокруг фактического объекта соединения JDBC, который вы можете использовать для хранения таких показателей )
  • Вы можете рассмотреть возможность использования подготовленных операторов.
  • Со временем вам, вероятно, понадобится настроить размер пула соединений

Не могли бы вы пояснить, как здесь могут помочь подготовленные заявления?

Epitaph 28.01.2009 03:26

@neilCoffey, если «отключение» соединений не рассматривается; Зачем нам нужно несколько подключений? одно единственное соединение может использоваться везде rit; поскольку объекты операторов всегда разные? Когда нам требуется множественное подключение в приложении?

Kanagavelu Sugumar 17.09.2012 22:09

Одно единственное соединение может использоваться для выполнения (теоретически) бесконечного количества запросов, как вы говорите. Но он может выполнять только один запрос за раз. В умеренно сложной системе обычно необходимо учитывать возможность одновременного выполнения нескольких запросов.

Neil Coffey 17.09.2012 23:40

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

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

Обычно объекты ниже «Соединение» не могут безопасно использоваться из нескольких потоков, поэтому обычно не рекомендуется совместно использовать ResultSet, объекты Statement и т. д. Между потоками - безусловно, лучшая политика - использовать их в том же потоке, который их создал; это обычно легко, потому что эти объекты обычно не хранятся слишком долго.

Многие драйверы JDBC делают за вас пул соединений, поэтому в этом случае нет особых преимуществ от использования дополнительного пула. Я предлагаю вам проверить документацию для вашего драйвера JDBC.

Другой подход к пулам соединений -

  • Одно соединение для всего доступа к базе данных с синхронизированным доступом. Это не допускает параллелизма, но очень просто.
  • Сохраните соединения в переменной ThreadLocal (переопределите initialValue ()). Это хорошо работает, если имеется небольшое фиксированное количество потоков.

В противном случае я бы предложил использовать пул соединений.

Другие вопросы по теме