утечка транзакций ibatis

Предположим, что у меня есть приложение, использующее ibatis 2 и spring 1. У меня есть внешний класс, который вызывает метод dao. Что произойдет, если запустить следующий код:

// external class

public void doSomething() {
    try {
        daoLayer.startTransaction();
        daoLayer.firstOperation();
        daoLayer.secondOperation();
    } finally {
        daoLayer.endTransaction();
    }
}

// dao layer which extends from org.springframework.orm.ibatis.support.SqlMapClientDaoSupport.SqlMapClientDaoSupport

public void startTransaction() { sqlMap.startTransaction(); }
public void firstOperation() { sqlMap.update("someQuery"); }
public void secondOperation() { sqlMap.update("someOtherQuery"); }
public void endTransaction() { sqlMap.endTransaction(); }
  1. Приведет ли этот код к утечке соединений с базой данных?
  2. Будет ли конечная транзакция выполняться в том же соединении транзакции/БД, которое выполняло методы startTransaction, firstOperation и secondOperation? Или может dbcp/ibatis выбрать другое соединение из пула?
  3. Что я могу сделать, чтобы проверить и убедиться, что для всех операций используется одно и то же соединение и что транзакция работает правильно?
  4. (Добавлено через Edit) — Изменится ли что-нибудь, если я перенес всю свою логику в один метод в дао? Будет ли это более безопасной транзакцией?

person David    schedule 17.08.2012    source источник


Ответы (1)


Will this code cause database connections to be leaked?

Нет, но для фиксации данных вам нужно включить sqlMap.commitTransaction() после daoLayer.secondOperation().

Will end transaction be run on the same transaction/db connection which executed the startTransaction, firstOperation, and secondOperation methods? Or might dbcp/ibatis pick a different connection out of the pool?

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

What could I do to test and make sure that the same connection is used for all the operations and that the transaction is working correctly?

В java: проверьте журналы для идентификатора соединения. Вы также можете проверить сервер базы данных на наличие назначенного идентификатора соединения.

Would anything change if I moved all my logic into a single method in the dao? Would that be more transaction safe?

Неважно, есть ли у вас одна или несколько операций DAO в одной транзакции.

person Satish Pandey    schedule 18.08.2012