我应该在Struts 2应用程序中的哪个位置设置数据库连接?

时间:2010-02-21 05:38:58

标签: java jdbc connection struts2

我正在使用struts 2开发一个小型Web应用程序。我想在Web应用程序启动时设置数据库连接。之后,我希望在整个Web应用程序中使用该数据库连接对象来更新数据库服务器中的记录。

我应该在struts2 Web应用程序中包含数据库连接设置代码?

1 个答案:

答案 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应用程序中)。