1

JDBI/JDBC/Mysql を使用する Java アプリケーションがあります。

いくつかの更新ステートメントをトランザクションとして実行しようとしています。つまり、autoCommit(false) を設定しています。ステートメントを実行すると、JDBI は影響を受ける行数を常に 1 として返します。

これがコードスニペットです。

DBI dbi = currShardHandle.getDBI();

//Open the connection once for each shard
Handle h = dbi.open();

handleList.add(h);
//set AutoCommit to false to start transaction
h.getConnection().setAutoCommit(false);

List<TransactionQuery> list = shardQueryMap.get(shardId);
for(TransactionQuery query: list) {
    currQuery = query;
    Update u = h.createStatement(query.getQuery());
    log.info("commit(). Query {}",query.getQuery());

    //Bind parameters
    int pos = 0;
    for(Object obj: query.getParams()) {
        if(obj == null)
            u.bindNull(pos++, java.sql.Types.JAVA_OBJECT);
        else
            u.bind(pos++, obj.toString());
    }

    u.setQueryTimeout(dbTimeout);
    try {

        int count = u.execute();
        log.debug("Rows Modified {} , Rewritten SQL {} ", count, u.getContext().getRewrittenSql());
        rowsModified += count;
    } finally {
        //.....
    }
}

私が実行しているSQL挿入は次のタイプです

INSERT into abc (x,y,z ) values (1,2,3) on duplicate key update z=z;

mysql クライアントで同じクエリを実行すると、影響を受ける行が 0 と表示されます。

4

1 に答える 1

2

mysql 5.1 でバグが報告されていることがわかりました。バグのリンクはこちら

http://bugs.mysql.com/bug.php?id=39352

JDBC Url に useAffectedRows=true を追加すると、問題が修正されました。

于 2014-05-05T22:02:15.577 に答える