У нас есть веб-сервер, обрабатывающий запросы от клиентов. Один компонент этого веб-сервера поддерживает соединение с базой данных.Есть ли безопасный способ узнать, поддерживает ли соединение JDBC?
Мне нужно знать, было ли соединение закрыто или каким-то образом перестало функционировать, прежде чем я начну его использовать. В настоящее время я делаю что-то вроде:
// Decide connection details on alias.
private String alias = null;
// I must have my own because I prepare statements.
private Connection connection = null;
public Connection getConnection() {
try {
if (connection.isClosed()) {
// Start afresh.
connection = null;
}
// ** More tests here to check connection is ok.
if (connection == null) {
// Make a new connection.
connection = Connections.getConnection(alias);
}
} catch (SQLException ex) {
// Cause a NPE further down the line.
connection = null;
}
return connection;
}
К сожалению, это иногда возвращает такое черствое соединение, которое я получаю одну из различных ошибок. Один из таких выглядит как:
java.sql.SQLException: Io исключение: Программное обеспечение вызвало подключение прерывание: Ошибка записи сокета
Обратите внимание, что это только одна из ошибок, записанных и это один происходит после того, как о 72 часа бездействия.
Что я ищу - это минимальный тестер базы данных для подключения, который должен постоянно указывать, работает ли соединение, работает и стабилен. Это возможно?
Я не против запуска очень небольшого запроса, но он должен быть агностиком базы данных и не требует мало времени/ресурсов.
BTW: Я бегу под Java 5, поэтому Connection.isValid
не является для меня решением.
Добавлено
Для тех из вас, посетив этот вопрос позже - В конце концов я принял совет предложил и переехал в настоящий пул соединений, а не только было удивительно легко сделать, но все из мои проблемы исчезли.
Единственная странная часть - это осознание того, что с пулом подключений вы должны подключиться, когда вы закончите с ним - пул перехватит закрытие и возвращает его в пул за кулисами.
Что у вас есть против готовых пулов соединений, которые проверяют соединения как обычные? –
@MarkoTopolnik - ничего - как такового - но я подготовил заявления, прикрепленные к этим соединениям, поэтому я должен сам справиться с ними. Или я? – OldCurmudgeon
На самом деле, это опасение, что эти пулы также обрабатываются с помощью подготовленных пулов инструкций. BTW мой выбор будет * boneCP *. –