这是我从文件中读取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)
,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
除了一个conn.setAutoCommit(true);
+ BoneCP
之外,几乎所有DB和DB Pool的组合都能完美地运行,而不会在代码中突出显示MySQL
。为了使这个组合起作用,我必须将conn.setAutoCommit(true);
放在update()
代码的末尾。另外,程序将在第3个进程的开始时挂起(第2个batchUpdate)。
我的猜测是因为它等待write lock
被释放而挂起,而我的第一个batchUpdate()
持有锁的唯一可能原因可能是因为我将连接设置为不提交自动导致BoneCP不释放write lock
。所以我添加了setAutCommit(true)
并且它有效。该计划不再挂起。
所以,我只是想问,我猜对了吗?还是因为别的什么?它应该被视为一个错误,因为没有其他组合发挥这种奇怪的行为?感谢。
答案 0 :(得分:0)
BoneCP有一个错误(在0.8.0-rc3中修复),默认情况下autocommit没有按照规范设置为true。
您可以设置config.setDefaultAutoCommit(true)来解决问题。