使用Java中的静态方法共享数据库连接

时间:2013-10-17 20:10:44

标签: java mysql design-patterns struts2 connection-pooling

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

我希望在我的模型类中有一堆静态方法,例如像User.exists( id )这样的东西,如果给定的用户id存在则会返回true,如果不存在则返回false。或其他实用方法,例如User.getEmail(id)User.disable(id)

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

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

1 个答案:

答案 0 :(得分:1)

是的,有可能。对于您希望每个Thread都有自己的Connection的情况,您需要使用ThreadLocal,因为每个请求都会生成自己的Thread。您只需确保在请求结束时关闭连接,这可以使用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();
        }
    }

}

<强> DBFilter

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

最好是使用框架来处理这类事情,例如Spring Framework已经通过代理服务来执行此操作,并且它处理连接和事务也为您提供了许多其他功能。