Подтвердить что ты не робот

Должно ли соединение db быть одиночным?

Каков наилучший способ создания синглета в Java? Должно ли соединение БД быть одноэлементным (будучи одноточечным, он автоматически потокобезопасен)? Поскольку теоретические БД не могут быть доступны для многих пользователей в одно и то же время.

4b9b3361

Ответ 1

Соединение с БД обычно не должно быть Singleton.

Две причины:

  • многие драйверы БД не являются потокобезопасными. Использование singleton означает, что если у вас много потоков, все они будут иметь одинаковое соединение. Шаблон singleton не дает вам безопасный поток. Он просто позволяет многим потокам легко делиться "глобальным" экземпляром.
  • Лично я считаю, что Singleton часто приводит к плохому дизайну: см. этот пост (кем-то еще) http://tech.puredanger.com/2007/07/03/pattern-hate-singleton/

Вместо этого рассмотрите пул баз данных. Пул является общим (и может быть синглом, если вы хотите). Когда вам нужно выполнять работу с базой данных, ваш код делает это:

getConnectioFromPool();

doWork()
closeConnection() // releases back to pool

Примеры библиотек пула:

Ответ 2

Лучший способ создать синглтон (на сегодняшний день) - это шаблон однократного переименования (Java enum singleton)

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

public ConnectionProvider {
  private Connection conn;

  public static Connection getConnection() {
    if (conn == null || conn.isClosed()) {
      conn = magicallyCreateNewConnection();
    }
    return conn;
  }
}

(небезопасный поток - синхронизировать, если необходимо)

Ответ 3

Каков наилучший способ создания Java? синглтон?

Следуйте инструкциям по созданию шаблона проектирования. i.e частный конструктор и т.д.

Если соединение с БД является одиночным (будучи одиночным автоматически потокобезопасный)?

создание соединения с БД в качестве одноэлементного устройства может быть плохим выбором дизайна во многих сценариях. Используйте его, только если вы уверены, что вам не нужен DB concurrency. Если у вас одновременно зарегистрировано несколько пользователей, или даже если ваш единственный пользователь порождает много потоков, которым необходим доступ к БД, то лучшим выбором будет пул соединений с БД. Вы можете использовать пулы соединений apache или tomcat db. Эти классы определены, например, в пакете

org.apache.commons.dbcp.*;

org.apache.tomcat.dbcp.dbcp.*;

где dbcp означает объединение пулов базы данных.

Самая большая причина использования пула соединений заключается в том, что в среднем время, необходимое для доступа к БД (DML и т.д.), намного меньше времени, необходимого для создания соединения, а затем закрытия соединения. Кроме того, не забудьте закрыть переменные ResultSet, PreparedStatement и Connection после завершения транзакции.

Поскольку теоретическая БД не может быть доступ ко многим пользователям в одном и том же время.

Почему бы и нет? БД в большинстве случаев предполагается использовать одновременно. У вас эти уровни изоляции БД - READ_COMMITTED, READ_UNCOMMITTED, SERIALIZED и т.д. SERIALIZED - это случай, когда ваша БД становится доступной для одного пользователя.

Ответ 4

Синглтоны - это шаблон - нет явного способа его создания, вы просто следуете практике проектирования.

Итак, если вы используете базу данных, которая может обрабатывать параллельные чтения/записи (т.е. MySQL), вам не нужно так беспокоиться о безопасности потоков. Если вы используете БД, который не выполняет параллельную запись (SQLite), то теоретически должен работать синглтон.