Должно ли соединение с базой данных оставаться открытым все время или открываться только при необходимости?

У меня есть плагин bukkit (minecraft), который требует подключения к базе данных.

Должно ли соединение с базой данных оставаться открытым все время или открываться и закрываться по мере необходимости?


person aman207    schedule 23.09.2013    source источник


Ответы (6)


Соединение с базой данных должно открываться только тогда, когда оно необходимо, и закрываться после выполнения всей необходимой работы с ним. Пример кода:

  • До Java 7:

      Connection con = null;
      try {
          con = ... //retrieve the database connection
          //do your work...
      } catch (SQLException e) {
          //handle the exception
      } finally {
          try {
              if (con != null) {
                  con.close();
              }
          } catch (SQLException shouldNotHandleMe) {
              //...
          }
      }
    
  • Ява 7:

      try (Connection con = ...) {
      } catch (SQLException e) {
      }
      //no need to call Connection#close since now Connection interface extends Autocloseable
    

Но поскольку вручную открывать соединение с базой данных слишком дорого, настоятельно рекомендуется использовать пул соединений с базой данных, представленный в Java с помощью DataSource. Это будет обрабатывать физические соединения с базой данных для вас, и когда вы закрываете его (т. е. вызываете Connection#close), физическое соединение с базой данных просто находится в режиме SLEEP и по-прежнему открыто.

Связанные вопросы/ответы:

Некоторые инструменты для управления пулом соединений с базой данных:

person Luiggi Mendoza    schedule 23.09.2013

Зависит от того, каковы ваши потребности.

Создание соединения занимает некоторое время, поэтому, если вам нужно часто обращаться к базе данных, лучше оставить соединение открытым. Также лучше создать пул, чтобы многие пользователи могли одновременно обращаться к базе данных (если это необходимо).

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

person qiGuar    schedule 23.09.2013

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

Используйте пул соединений. Если вы разрабатываете веб-приложение, используйте пул соединений сервера приложений. Сервер приложений будет использовать один и тот же пул для каждого из ваших приложений, чтобы вы могли контролировать количество соединений из одной точки. Настоятельно рекомендуется пул соединений Apache Tomcat.Пример

В качестве дополнительной информации: Connection, Statement и ResultSet.

1. Если вы закрываете соединение, вам не нужен оператор закрытия или набор результатов. Оба они будут закрыты автоматически.

2. Если вы закроете оператор, он также закроет ResultSet.

3.если вы используете try-with-resources следующим образом:

try (Connection con = ...) {
} catch (SQLException e) {
}

он автоматически закроет соединение. Поскольку для попытки с ресурсами требуются автоматически закрываемые объекты, а соединение автоматически закрывается. Вы можете увидеть подробности о попытке с ресурсами здесь

person Sarkhan    schedule 14.08.2017

На самом деле, все дело в том, как вы пишете свое приложение! Это искусство, но, к сожалению, все берут учебники для хорошей практики, такие как учебники Microsoft.

Если вы знаете, что вы кодируете, вы сохраняете соединение открытым на протяжении всего времени существования приложения. Все просто, не потому, что вам нужно идти утром на работу, а каждый день мы должны строить специальный маршрут именно для вас! Вы выбираете этот единственный маршрут или 2 или 4, как и все! Вы судите по трафику и строите 2, 4 или 6 маршрутов по мере необходимости. Если есть трафик с этими 4 или 6 маршрутами, ждите!

Удачного кодирования.

person intiko81    schedule 10.07.2015
comment
Хорошая аналогия с подключением к базе данных и ежедневными поездками на работу. - person Tech Expert Wizard; 26.11.2020

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

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

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

finally
{
connection.close()
}
person Sai Avinash    schedule 23.09.2013

Каждый раз, когда вы подключаетесь, у вас есть задержка, а теперь представьте, что произойдет, если вы всегда подключаетесь и закрываете

person Itrulia    schedule 23.09.2013
comment
Примечание. Вы должны всегда подключаться и закрываться. - person Luiggi Mendoza; 23.09.2013
comment
да, но нет, если у вас более 20 взаимодействий с базой данных, вы ждете, пока она больше не понадобится, и обычно это происходит, когда вы закрываете приложение. - person Itrulia; 23.09.2013
comment
Вот почему вы должны использовать пул соединений с базой данных вместо того, чтобы вручную создавать соединение с базой данных и пытаться держать его открытым. - person Luiggi Mendoza; 23.09.2013
comment
Если соединение открыто для одного пользователя в течение большого количества времени, представьте, как другие пользователи могут получить доступ к приложению. - person Sai Avinash; 23.09.2013
comment
@LuiggiMendoza Да, использование пулов соединений — хорошая альтернатива постоянному поддержанию соединения полностью открытым. - person Tech Expert Wizard; 26.11.2020