соединение дб должно быть синглтоном? - PullRequest
18 голосов
/ 28 июня 2011

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

Ответы [ 4 ]

25 голосов
/ 28 июня 2011

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

Две причины:

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

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

getConnectioFromPool();

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

Библиотеки пулов образцов:

4 голосов
/ 28 июня 2011

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

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

public ConnectionProvider {
  private Connection conn;

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

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

3 голосов
/ 28 июня 2011

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

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

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

org.apache.commons.dbcp.*;

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

, где dbcp обозначает пул соединений с базой данных.

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

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

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

2 голосов
/ 28 июня 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...