Вы не должны устанавливать соединение с базой данных при запуске веб-приложения. БД прервет соединение, когда оно будет выпущено в течение слишком долгого времени, и это действительно короче (~ 30 минут), чем время жизни среднего веб-приложения (дни, месяцы, годы). Вместо этого настройте источник данных / фабрику DAO на этом этапе. Соединения должны быть получены и закрыты в кратчайшем объеме 1002 *. Обычная идиома JDBC следующая:
public void create(Entity entity) throws SQLException {
Connection connection = null;
PreparedStatement statement = null;
try {
connection = database.getConnection();
statement = connection.prepareStatement(SQL_CREATE);
statement.setSomeObject(1, entity.getSomeProperty());
// ...
statement.executeUpdate();
} finally {
if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}
}
Обратите внимание на закрытие в finally
. Это предотвращает утечку ресурсов (то есть не закрывает их), когда происходит исключение.
Чтобы улучшить производительность соединения, вы обычно хотите использовать пул соединений. Любой приличный appserver предоставляет эту возможность во вкусе источника данных JNDI. Например, в Tomcat вы можете найти в JNDI Resources HOW-TO как его создать. Между прочим, это не означает, что вам не нужно закрывать их, вам все же необходимо закрыть их в соответствии с обычной идиомой JDBC. В частности, пул соединений возвращает упакованное соединение, которое выполняет в close()
что-то вроде следующего:
public void close() throws SQLException {
if (this.connection is still eligible for reuse) {
do not close this.connection, but just return it to pool for reuse;
} else {
actually invoke this.connection.close();
}
}
Что касается настройки источника данных (или фабрики DAO) при запуске веб-приложения, существует несколько способов. Один из них использует ServletContextListener
, который выполняет задачу в методе contextInitialized()
, другой способ - использование bean-объекта с областью действия под управлением Struts2, который выполняет задачу в конструкторе.
Также см. Этот базовый учебник по JDBC / DAO для получения дополнительных советов о том, как правильно начать работу с JDBC (в веб-приложениях).