使用连接池(本地或实例)的网站的连接对象的范围

时间:2010-02-09 00:41:46

标签: design-patterns web-applications connection-pooling

对于启用了连接轮询的Web应用程序,最好使用本地范围的连接对象或实例范围的连接对象。我知道两者之间可能没有很大的性能提升(因为汇集),但是你会说一个比另一个更好的模式。谢谢;)

public class MyServlet extends HttpServlet {
    DataSource ds;

    public void init() throws ServletException {
        ds = (DataSource) getServletContext().getAttribute("DBCPool");
    }

    protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
        SomeWork("SELECT * FROM A");
        SomeWork("SELECT * FROM B");
    }

    void SomeWork(String sql) {
        Connection conn = null;
        try {
            conn = ds.getConnection();
            // execute some sql
            .....
        } finally {
            if(conn != null) {
                conn.close(); // return to pool
            }
        }
    }
}

或者

public class MyServlet extends HttpServlet {
    DataSource ds;
    Connection conn;*

    public void init() throws ServletException {
        ds = (DataSource) getServletContext().getAttribute("DBCPool");
    }

    protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
        try {
            conn = ds.getConnection();
            SomeWork("SELECT * FROM A");
            SomeWork("SELECT * FROM B");
        } finally {
            if(conn != null) {
                conn.close(); // return to pool
            }
        }
    }

    void SomeWork(String sql) {
        // execute some sql
        .....
    }
}

1 个答案:

答案 0 :(得分:1)

你应该采用这种方法:

  1. 从泳池中取得连接
  2. 执行完整的事务,将数据库从一个有效状态移动到下一个
  3. 提交
  4. 将连接返回到池
  5. 返回HTTP响应
  6. 您的第一种方法并不是一个好主意,因为如果其中一个工作单元失败,您可能会使数据库处于不一致的状态。

    也许您将完成第一个工作单元,然后无法进行第二个池连接(其他一些线程首先进入)。也许在负载很重的情况下,这将发生在多个请求中,没有任何事情可以正常完成。