Какие преимущества имеют
несколько пулов над одним пулом?
Я предположил, что большинство пулов объектов, которые мы используем, например ThreadPool, для простоты реализованы как синглтоны: в этом дизайнеры этих пулов также не видели цели в пулах с несколькими экземплярами.
Однако есть несколько мест, где у нас действительно есть несколько пулов: пулы приложений IIS и пулы соединений с базами данных.
Пулы приложений
В IIS вы можете настроить несколько пулов приложений, чтобы все связанные веб-приложения работали в своем собственном пуле. У этой конструкции есть несколько преимуществ, и эти преимущества можно обобщить для реализации пула вне IIS:
Несколько пулов объектов допускают некоторую степень изоляции, поэтому ошибка в одном пуле не должна влиять на объекты в других пулах.
Каждый пул может работать под своим пользователем, что обеспечивает разные уровни безопасности в зависимости от пула приложений.
В каждом пуле может быть свой обработчик ошибок.
Каждый пул может работать с другой версией .NET Framework.
Каждый пул может иметь собственный тайм-аут HTTP.
Пулы соединений
В SQL Server несколько вызовов к базе данных используют пул соединений, чтобы избежать затрат на создание нового соединения с базой данных при каждом запросе, однако SQL Server создает новый пул для каждой строки соединения . Я полагаю, что обоснование этого дизайна заключается в следующем:
Каждый пул содержит соединение с конкретным экземпляром базы данных. Если бы был только один пул, содержащий все соединения, то ему потребовался бы поиск по всем соединениям, пока он не найдет соединение, соответствующее запрашиваемой строке соединения. Поскольку в строке подключения имеется несколько пулов, проще извлечь первое доступное соединение из этого конкретного пула без поиска других соединений.
Другими словами, я подозреваю, что SQL Server использует несколько пулов соединений в качестве оптимизации для быстрого захвата соединения с базой данных.
Я также могу представить, что все эти соединения, вероятно, совместно используют некоторые ресурсы, специфичные для их пула соединений, что может быть невозможно для одного пула. Например, вы можете указать максимальный размер пула соединений для каждой строки соединения; Возможно, вы не сможете контролировать количество одновременных подключений к конкретной базе данных, используя схему с одним пулом.
Как спроектировать бассейн
Вы не можете выбрать, использовать ли несколько пулов или один пул, не взглянув на то, что вам действительно нужно из вашего дизайна.
Если у вас очень простой пул объектов, вам, возможно, удастся сойтись с одноэлементным дизайном. Если вам действительно нужна дополнительная гибкость, настройка или, возможно, у вас есть действительно уникальная настройка, например, пул объектов, распределенный по нескольким процессам или машинам, вам определенно будет полезен дизайн n-gleton.