Вам не обязательно убивать этот пул, чтобы создать новый.
Вы можете управлять подключениями в нем, используя параметры maxIdle, timeBetweenEvictionRunsMillis и minEvictableIdleTimeMillis (см. здесь ), чтобы гарантировать, что незанятые соединения будут закрыты в разумные сроки.
Или вы можете настроить GenericObjectPool с этими параметрами программно и использовать при создании PoolingDataSource. У него есть метод close (), если вы хотите его принудительно вызвать.