0

これは、ファイルから SQL を読み取り、バッチ更新を行うための私のコードです。

public void update(Connection conn, File f) {
    Statement st = null;
    Scanner sc = null;
    try {
        conn.setAutoCommit(false);
        st = conn.createStatement(); 

        //Scann the file line by line and addBatch each line...

        st.executeBatch();
        conn.commit();

        /************************/
        conn.setAutoCommit(true);
        /************************/

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (st != null) { st.close();}
            if (conn != null) { conn.close(); }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

試したデータベース: HSQLDB(in-process mode), HSQLDB(memory mode),MySQL

試したDBプーリング: No Pooling(DriverManger), DBCP,BoneCP

私のアプリケーションは次の順序で実行されます。

1. one batchUpdate() to execute many "create table" and "insert" SQL statement
2. many executeQuery() to execute many "select" SQL statement
3. one batchUpdate() to execute many "drop table" statement

DB と DB プールのほぼすべての組み合わせはconn.setAutoCommit(true);、コードで強調表示したものなしで完全に機能しBoneCPますMySQL。この組み合わせを機能させるには、それをコードconn.setAutoCommit(true);の最後に配置する必要がありupdate()ます。そうしないと、プログラムは 3 番目のプロセス (2 番目のバッチ更新) の開始時にハングします。

私の推測では、write lockが解放されるのを待っているためにハングしているということでした。最初batchUpdate()にロックを保持した唯一の理由は、接続を自動的にコミットしないように設定したため、BoneCP が を解放しなかったためである可能性がありますwrite lock。だから私は追加しsetAutCommit(true)、それはうまくいきました。プログラムはもうハングしません。

それで、私はただ聞きたいのですが、私の推測は正しかったですか?それとも何か他の理由ですか?他の組み合わせでこの種の奇妙な動作が発生することはないので、これはバグと見なすべきでしょうか? ありがとう。

4

1 に答える 1