Существует много, много компромиссов при открытии и закрытии соединений, сохранении их открытыми, проверке того, что соединения, которые были "оставлены в живых", остаются "действительными", когда вы начинаете их использовать снова, аннулировании соединений, которые повреждены и т. Д. Подобные сложные компромиссы затрудняют (но, конечно, не делают невозможным) реализацию «наилучшей» стратегии управления соединениями для вашего конкретного случая. Самый безопасный метод - открыть соединение, использовать его, а затем закрыть. Но, как вы уже поняли, это вовсе не самый эффективный метод. Если вы управляете своими собственными соединениями, то по мере того, как вы делаете вещи, чтобы сделать вашу стратегию более эффективной, сложность возрастает очень быстро (особенно при наличии каких-то неидеальных драйверов JDBC, которых много.)
Существует множество библиотек пула подключений, которые могут позаботиться обо всем этом для вас чрезвычайно настраиваемыми способами (они почти всегда поставляются предварительно настроенными из коробки для наиболее типичных случаев, и до тех пор, пока вы до такой степени, что вы выполняете действия с высокой нагрузкой, вам, вероятно, не нужно беспокоиться обо всей этой настраиваемости - но вы будете рады иметь ее, если вы увеличите масштаб!) Как всегда, библиотеки сами могут быть разного качества.
Я успешно использовал C3P0 и Apache DBCP . Если бы я выбрал сегодня снова, я бы, вероятно, пошел с DBCP.