[Seasar-user:13013] Re: [DBFlute]SqlLogRegist ry について

kubo [E-MAIL ADDRESS DELETED]
2008年 2月 22日 (金) 23:16:19 JST


久保です。

ご報告ありがとうございます。

利用DBはOracleでいいでしょうか?
(以前のMLから想像してます)

OracleのJDBCドライバがバッチ更新の結果を
正確に返してくれないようなので(事象からすると)、
batchUpdate()の排他制御機能はOracleでは効かないです。
で、判定がどうしてもできないため、その回避策もありません。
(幾つかの他のDBでは大丈夫でした(MySQLなど))

dbflute-oracle-exampleに以下のようなテストを追加して
やってみました。(ojdbc14.jar / ojdbc5.jar両方で同じでした)

    public void
test_batchUpdate_JDBCDriverCannotReturnAccurateResult_Tx() throws
Exception {
        // ## Arrange ##
        final List<Member> memberList = new ArrayList<Member>();
        final Member member = new Member();
        member.setMemberId(1L);
        member.setMemberName("Billy Joel");
        member.setMemberAccount("billyjoel");
        member.classifyMemberStatusCodeFormalized();
        member.setVersionNo(-99L);
        memberList.add(member);

        // ## Act ##
        int[] updatedResult = null;
        try {
            updatedResult = memberBhv.batchUpdate(memberList);
            // fail();
        } catch (EntityAlreadyUpdatedException e) {
            fail("本来はOKなのはずだが、OracleのJDBCドライバが正確な更新結果を返してくれない");
        }

        // ## Assert ##
        log("updatedResult[0] = " + updatedResult[0]);
        assertEquals(Statement.SUCCESS_NO_INFO, updatedResult[0]);
        ...
    }

もし、Oracleのサポートなど問い合わせ可能な窓口があれば、
そちらに問い合わせして頂くしかないかなというところです。
(正確な値を返すJDBCドライバのバージョンがあるのか?など)

しっかり仕様として提示できなかったこと大変申し訳ありません。
こちら、取り急ぎドキュメントに反映させておきました。
http://dbflute.sandbox.seasar.org/contents/dbvendor/oracle.html

2008/2/22  <[E-MAIL ADDRESS DELETED]>:
> いつもお世話になっております。
>  米原です。
>
>
>
>  >> 「-2」が入っていました。
>  >ちょっとやな予感しますね。。。
>
>  >逆に更新がうまくいったときは何が戻るか
>  >確認頂けますでしょうか?
>
>
>  うまくいったとき(単発で動かしたとき)も「-2」を返してます。
>  また、ログも同様に(All updated count: -2 result={-2})
>  と出てます。
>
>  だいぶ見にくいですが、batchUpdate単発で動かしたときの
>  batchUpdateのログを一応つけますね。
>
>
>
>  2008.02.22 22:39:53.390,/================================================================================
>  2008.02.22 22:39:53.390,                                                      XxxDao.updateList()
>  2008.02.22 22:39:53.390,                                                      ==========================/
>  2008.02.22 22:39:53.406,XxxUnitPage.doRunEdit():776 --> XxxBhv.batchUpdate() --> ...
>  2008.02.22 22:39:53.406,UPDATE XXX SET A = '000000201', UPD_NITIJI = '2008-02-22 22.39.53', B = '201', C = '202', D = '203', E = '住所204', F = '内容205', G = '09000000201 ', H = '20061210  ', I = null, J = '1 ', K = '2 ', L = '2 ', M = '2 ', N = '2 ', O = '1 ', P = 1, Q = 1, R = 1, S = 1, T = 1, U = '2', V = '1', TRK_NITIJI = null, W = null, X = '131011', Y = null, Z  = 'xap' WHERE ID = 196 AND UPD_NITIJI = '2008-02-22 22.39.23'
>  2008.02.22 22:39:53.406,===========/ [00m00s000ms - All updated count: -2 result={-2}]
>  2008.02.22 22:39:53.406,
>  2008.02.22 22:40:00.437,/================================================================================
>
>
>
>
>
>
>
>
>
>  >batchUpdate()の実行時のSQLのログで、
>  >Where句に排他制御用の条件が付与されていますか?
>  >(ex. WHERE BOOK_ID = 2 AND U_TIMESTAMP = '2007...')
>
>  はい、付与されています。
>
>
>  >また、batchUpdate()の戻り値は何が入っていますでしょうか?
>  >int[]の中身をご確認お願いします。
>
>  1回目のbatchUpdate,2回目のbatchUpdate(楽観排他時)とも
>  「-2」が入っていました。
>
>  ログを見るとそれぞれ、同じ以下の結果です。
>  (All updated count: -2 result={-2})
>
>  _______________________________________________
>  Seasar-user mailing list
>  [E-MAIL ADDRESS DELETED]
>  https://ml.seasar.org/mailman/listinfo/seasar-user
>


Seasar-user メーリングリストの案内