Объем объекта подключения для веб-сайта, использующего пул подключений (локальный или экземпляр) - PullRequest
0 голосов
/ 09 февраля 2010

Для веб-приложения с включенным опросом подключений лучше работать с объектом подключения с локальной областью действия или объектом подключения с экземпляром. Я знаю, что между ними (вероятно, из-за объединения), вероятно, нет значительного улучшения производительности, но вы бы сказали, что один следует лучшему шаблону, чем другой. Спасибо;)

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 Ответ

1 голос
/ 13 июля 2010

Вы должны принять этот подход:

  1. Взять соединение из пула
  2. Провести полную транзакцию, перемещая базу данных из одного действительного состояния в следующее
  3. Commit
  4. Вернуть соединение в пул
  5. Вернуть HTTP-ответ

Ваш первый подход не является хорошей идеей, потому что, если одна из единиц работы дает сбой, вы можете оставить базу данных в несовместимом состоянии.

Возможно, вы завершите первую единицу работы, а затем не сможете подключиться ко второму пулу (какой-то другой поток попал первым). Возможно, при большой нагрузке это произойдет с несколькими запросами, и ничего не будет сделано должным образом.

...