Вам обычно нужно:
- какая-то оболочка для «необработанных» объектов Соединения для управления такими вещами, как когда последнее соединение было установлено, диагностическая информация, возможно, кэш ваших подготовленных операторов для этого соединения и т. Д.
- коллекция для размещения оболочек соединений, поддерживающая одновременные добавления / удаления - подойдет любой правильно синхронизированный список, но разумным выбором будет ConcurrentLinkedQueue
- способ управления выделениями из пула - рассмотрите возможность использования Семафор класс
- возможно, объединение различных пулов в некоторый "класс управления пулами" (например, так что вы можете просто вызвать "getConnection (databaseName, readOnly)" и он перейдет в соответствующий пул)
Кроме того, вы можете создать все необходимое для ведения журнала / мониторинга.
Есть также сторонники готовых платформ соединений пула. Я знаю, что есть те, кто не согласен, но я лично не пошел бы по этому пути - пул соединений (а) действительно не сложно написать, (б) образует ключевую часть вашей системы, которую вы, вероятно, должны понимать и настроить.