我正在使用struts 2开发一个小型Web应用程序。我想在Web应用程序启动时设置数据库连接。之后,我希望在整个Web应用程序中使用该数据库连接对象来更新数据库服务器中的记录。
我应该在struts2 Web应用程序中包含数据库连接设置代码?
答案 0 :(得分:0)
您不应该在webapp启动时设置数据库连接。数据库会在连接释放太长时间后超时,并且比一般Web应用程序的生存时间(天,月,年)真正缩短(约30分钟)。而是在那时设置数据源/ DAO工厂。要在尽可能短的范围内获取和关闭连接。正常的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();
}
}
关于在webapp启动时设置数据源(或DAO工厂),有几种方法。一个是使用ServletContextListener
执行contextInitialized()
方法中的任务,另一种方法是使用Struts2管理的应用程序范围bean来完成构造函数中的任务。
另请参阅此basic JDBC/DAO tutorial以获取更多提示,了解如何以正确的方式开始使用JDBC(在Web应用程序中)。