Пользовательский объект подключения к базе данных: должен ли я использовать общий (singleton) или один на экземпляр объекта? - PullRequest
0 голосов
/ 23 ноября 2018

Какова лучшая практика: создать только один статический класс (Singleton), который обеспечивает все необходимое соединение с базой данных, или создать один объект на экземпляр DAO?Обратите внимание, что мой проект имеет доступ к нескольким базам данных одновременно, поэтому я создал класс AcessoBanco, который получает файл конфигурации .INI и возвращает мне все необходимые мне соединения.Я использовал подход с использованием одного статического класса, но получал отдельные исключения относительно параллелизма, потому что система выполняет несколько многопоточных задач.Я решил это, создав блокировки в классе AcessoBanco, но это действительно хорошая идея?Может быть, если я поставлю один экземпляр AcessoBanco на каждый объект dao, проблема параллелизма может быть решена более элегантно, я прав?Некоторые примеры:

Использование одноэлементного подхода

public class Repository1
{
    public Repository1(string iniFilePath)
    {
        AcessoBanco.Configure(iniFilePath); // Singleton that creates all the connections (concurrency excepction solved using locks)

        // After configured, just call AcessoBanco.GetConnections() in any point of the code to get the connections 
    }
}

Использование одного экземпляра на объект

public class Repository2
{
    public AcessoBanco Conexoes { get; set; }
    public Repository2(string iniFilePath)
    {
        Conexoes = new AcessoBanco(iniFilePath); // Using one instance of AcessoBanco in each DAO. I will need to do it in every DAO.
    }
}

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Предоставленные вами данные не указывают на то, что использование шаблона Singleton является хорошей идеей;напротив, как вы уже обнаружили, это может вызвать проблемы с многопоточными приложениями.Большинство механизмов базы данных поддерживают пулы соединений, и издержки на открытие / закрытие соединений должны быть минимальными.Не открывайте соединение заранее.Просто откройте / закройте соединение на время, когда оно вам строго необходимо.Вы создаете больше головной боли, чем вам нужно.

Нет ничего плохого в таком шаблоне или в чем-то подобном:

using (var connection = new Connection()){

}
0 голосов
/ 23 ноября 2018

Это в значительной степени зависит от того, какой тип БД вы используете.

Всего 2 примера:

  1. CosmosDB - рекомендуется использовать единственный экземпляр клиента, так как он использует(чаще всего) HTTP-вызовы, которым нравится HttpClient одноэлементный экземпляр
  2. ADO.NET (для сервера sql) - крайне плохая идея иметь одноэлементные экземпляры, поскольку ваше приложение может захотеть использовать соединение из разных потоков, а вы 'Я столкнусь с целой кучей разных вопросов.Именно поэтому он использует пул соединений под капотом.
...