0

我正在使用 Struts 2 开发一个 java web 应用程序。目前,在每个页面加载时,我都会建立一个新的数据库连接,然后在请求结束时关闭这个数据库连接,就在呈现结果 HTML 之前。因此,每个请求都有自己的数据库连接。

我想在我的模型类中有一堆静态方法,例如User.exists( id ),如果给定的用户 id 存在则返回 true,否则返回 false。或其他实用方法,如User.getEmail(id)or User.disable(id)

我的问题是,有没有一种方便的方法可以与这些静态方法共享数据库连接?必须将连接作为第二个参数传递给所有这些方法,例如,User.exists(id, db)这会很丑陋,而且不太方便。

如果我在这些实用程序方法中的每一个中获得一个新的数据库连接,并在返回结果之前关闭它会怎样?会不会对性能有影响?有时我可能需要在一个请求中调用这些方法 20-30 次(例如在验证用户输入时)。

4

1 回答 1

1

是的,有可能。对于这种您希望每个线程都有自己的连接的情况,您需要使用ThreadLocal,因为每个请求都会产生自己的线程。您只需要确保在请求结束时关闭连接,这是使用Filter实现的。

过滤器应该在任何其他过滤器之前,以确保连接在请求结束时关闭。

DBUtil:

public class DBUtil {

    private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>();

    public static Connection getConnection() {
        Connection connection = connectionHolder.get();
        if (connection == null) {
            //open the connection (lazy loaded)

            //store it
            connectionHolder.set(connection);

        }
        return connectionHolder.get();
    }

    public static void close() {
        Connection connection = connectionHolder.get();
        if (connection != null) {
            //close the connection

            //remove it from the connection holder
            connectionHolder.remove();
        }
    }

}

数据库过滤器

public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {       
    try {
        chain.doFilter(request, response);
    } finally {
        DBUtil.close();         
    }
}

如果你为这类事情使用框架会更好,例如Spring Framework已经通过代理你的服务来做到这一点,它处理连接和事务还为你提供了许多其他功能。

于 2013-10-17T20:20:34.080 回答