代码之家  ›  专栏  ›  技术社区  ›  Ali

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

  •  0
  • Ali  · 技术社区  · 11 年前

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

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

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

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

    1 回复  |  直到 11 年前
        1
  •  1
  •   Alfredo Osorio    11 年前

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

    筛选器应位于任何其他筛选器之前,以确保在请求结束时关闭连接。

    数据库实用程序:

    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();
            }
        }
    
    }
    

    DB过滤器 :

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

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