1. Даже если у вас один клиент, пул соединений может быть полезен. Подключение к базе данных может занять значительное время, поэтому очень часто это может замедлять работу приложения из-за медленных сетевых запросов. Более того, как объясняет @teabot, пул может помочь определить, не закрывается ли какое-либо соединение.
2. Не стоит открывать соединение и оставлять его открытым навсегда по двум причинам. Сначала соединение может прерваться, если произойдет временное прерывание сети. Чем дольше он открыт, тем более вероятно, что он мертв, когда это необходимо. Во-вторых, неудачная транзакция может оставить соединение в состоянии, не подходящем для продолжения работы. Обычно лучше всего открыть несколько соединений, повторно использовать их в течение пяти или десяти минут, а затем утилизировать.
3. В зависимости от базы данных и драйвера, соединение может иметь подготовленный кэш операторов. Даже если используется другое соединение, СУБД обычно кэширует точно такие же операторы, включая ее параметры. Поэтому SELECT * FROM table WHERE value =? как подготовленный оператор будет кэшироваться через соединения, но если вы укажете значение параметра, например SELECT * FROM table WHERE value = 'your_data', то, вероятно, оно не будет кэшировано на стороне сервера.
4. Как объяснено в 3, зависит от реализации СУБД, сделайте эталонный тест.
5. Нет необходимости закрывать и снова подготавливать оператор, который будет повторно использоваться с другими параметрами. Просто снова установите параметры и выполните.
Для нескольких клиентов база данных всегда будет иметь ограничение одновременных соединений, которое обычно не является большим числом. Если все клиенты проходят через веб-приложение, то с пулом вроде DBCP все в порядке. Но очевидно, что нежелательно создавать пул для каждого клиента с постоянно открытыми несколькими подключениями.