1

ibatis2とspring1を使用するアプリケーションがあるとします。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メソッドを実行したのと同じtransaction / db接続で実行されますか?または、dbcp / ibatisがプールから別の接続を選択する可能性がありますか?
  3. すべての操作に同じ接続が使用され、トランザクションが正しく機能していることをテストして確認するにはどうすればよいですか?
  4. (編集で追加)-daoですべてのロジックを1つのメソッドに移動した場合、何か変更はありますか?それはよりトランザクションの安全性が高いでしょうか?
4

1 に答える 1

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の場合:接続IDのログを確認します。割り当てられた接続IDについてデータベースサーバーを確認することもできます。

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

単一のトランザクションに単一または複数のDAO操作があるかどうかは関係ありません。

于 2012-08-18T14:21:32.523 に答える