Таким образом, это клиентское приложение? Приложение и база данных обычно разговаривают друг с другом, используя соединение, полученное с помощью DriverManager#getConnection()
? Если это так, то вам не обязательно нужен JNDI, чтобы заставить пул соединений работать. Единственное, о чем идет речь, будет уже достаточно. Например, C3P0 или Apache Commons DBCP (я бы рекомендовал C3P0, DBCP - односторонний). Просто замените его DriverManager#getConnection()
.
Edit: ответить на ваши комментарии:
Сервер будет говорить с базой данных и клиенты подключаются к серверу, так что я не знаю, можно ли назвать это клиентское приложение.
Я на самом деле имею в виду простой Java-приложение, которое не запускается внутри контейнера Java EE. Паскаль сформулировал это лучше.
На самом деле, я немного смущен тем, как работает объединение пулов, выполняется ли каждое соединение в его собственном потоке? есть ли какой-либо документ/книга, чтобы помочь мне лучше понять эти концепции по сравнению с не объединенным соединением?
Чтобы начать, пул соединений открывает соединение и удерживает его открытым до тех пор, пока не будет установлен установленный тайм-аут. Пул подключений обертывает/decorates соединение с его собственной реализацией. Пул соединений может одновременно открывать и удерживать сконфигурированное количество подключений. Когда вы позвоните по номеру getConnection()
, он немедленно предоставит вам уже открытое соединение. Когда вы вызываете close()
на соединение, он вернет соединение обратно в пул для будущих запросов. Это означает, что вам все равно придется писать код JDBC обычным способом: приобрести и закрыть Connection
, Statement
и ResultSet
в кратчайший возможный объем. Закройте все их в блоке finally
.Если ваш код JDBC уже хорошо написан, на самом деле толькоDriverManager#getConnection()
необходимо заменить. Поскольку вы должны открывать и закрывать Connection
в том же блоке методов, он обычно запускается в том же потоке. Пул соединений будет беспокоиться о том, что Connection
не приобретается другими потоками, пока ваш код не назовет close()
на Connection
.
Вы можете найти here хорошую статью, чтобы получить представление о том, как работает объединение пулов под капотом (позаботьтесь: не используйте его для производства и не делайте это самостоятельно, просто получите всю идею) , Для реальной работы используйте существующую тщательно разработанную и надежную структуру объединения пулов.
Сервер будет разговаривать с базой данных, а клиенты подключаются к серверу, поэтому я не буду знать, следует ли называть это клиентское приложение. И да, серверная часть кода использует DriverManager.getConnection(), спасибо за ссылку C3P0. –
Спасибо за ясное, краткое объяснение, я сделал несколько примеров кода с помощью DriverManager, но я поддерживал соединение открытым. Мои клиенты используют сокеты для подключения к серверу и будут оставаться подключенными. Каждый клиент работает в своем потоке чтения/записи, поэтому, если сервер хочет передать данные, он просто запрашивает данные из базы данных (из уже открытого соединения) и передает их клиенту. Правильно ли это, или я должен закрыть соединение как можно скорее? –
Обычная практика заключается в том, что вы должны закрыть соединение в блоке finally, чтобы избежать утечек ресурсов и/или потенциальных сбоев приложений в случае, если у вас открыто несколько соединений и/или что DB отключает соединение. Чтобы улучшить производительность соединения, лучше всего использовать пул соединений. Просто убедитесь, что вы не настроили тайм-аут пула соединений (т. Е. Как долго держать соединение открытым) дольше, чем собственный тайм-аут соединения БД. – BalusC