Каков наилучший способ создания синглета в Java? Должно ли соединение БД быть одноэлементным (будучи одноточечным, он автоматически потокобезопасен)? Поскольку теоретические БД не могут быть доступны для многих пользователей в одно и то же время.
Должно ли соединение db быть одиночным?
Ответ 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), то теоретически должен работать синглтон.