当使用MySQL和BoneCP的组合时,jdbc executeBatch挂起

时间:2013-08-11 17:19:13

标签: java mysql jdbc bonecp autocommit

这是我从文件中读取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 Pooling我尝试过:No Pooling(DriverManger)DBCPBoneCP

我的应用程序按以下顺序运行:

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

除了一个conn.setAutoCommit(true); + BoneCP之外,几乎所有DB和DB Pool的组合都能完美地运行,而不会在代码中突出显示MySQL。为了使这个组合起作用,我必须将conn.setAutoCommit(true);放在update()代码的末尾。另外,程序将在第3个进程的开始时挂起(第2个batchUpdate)。

我的猜测是因为它等待write lock被释放而挂起,而我的第一个batchUpdate()持有锁的唯一可能原因可能是因为我将连接设置为不提交自动导致BoneCP不释放write lock。所以我添加了setAutCommit(true)并且它有效。该计划不再挂起。

所以,我只是想问,我猜对了吗?还是因为别的什么?它应该被视为一个错误,因为没有其他组合发挥这种奇怪的行为?感谢。

1 个答案:

答案 0 :(得分:0)

BoneCP有一个错误(在0.8.0-rc3中修复),默认情况下autocommit没有按照规范设置为true。

您可以设置config.setDefaultAutoCommit(true)来解决问题。