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

数据库池我试过了: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

几乎所有 DB 和 DB Pool 的组合都可以完美运行,没有conn.setAutoCommit(true);我在代码中突出显示的,除了一个:BoneCP+ MySQL。为了使这种组合起作用,我必须将其放在代码conn.setAutoCommit(true);的末尾。update()否则,程序将在第三个进程(第二个批处理更新)开始时挂起。

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

所以,我只想问,我猜对了吗?还是因为其他原因?是否应该将其视为错误,因为没有其他组合会产生这种奇怪的行为?谢谢。

4

1 回答 1

0

BoneCP 有一个错误(在 0.8.0-rc3 中修复),根据规范默认情况下自动提交未设置为 true。

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

于 2013-09-12T13:50:57.010 回答