我有以下方法。註釋方法saveOrUpdateToDatabase執行得很好,但我想使用executeBatch。我錯過了什麼?收到executeBatch()結果的int [] r始終爲空......SQL PreparedStatement.executeBatch()在SQLite不工作
public boolean saveOrUpdate(MonitoredData mData) {
try {
PreparedStatement prep;
String timeID = this.getTimeLastRowID();
for (CpuData o : mData.getCpu()) {
prep = this.conn.prepareStatement(String.format(
INSERT_CPU_USAGE, this.nodeID, timeID, o.toString()));
prep.addBatch();
// saveOrUpdateToDatabase(String.format(INSERT_CPU_USAGE,
// this.nodeID, timeID, o.toString()));
}
for (DiskData o : mData.getDisk()) {
prep = this.conn.prepareStatement(String.format(
INSERT_DISK_USAGE, this.nodeID, timeID, o.toString()));
prep.addBatch();
// saveOrUpdateToDatabase(String.format(INSERT_DISK_USAGE,
// this.nodeID, timeID, o.toString()));
}
for (NetworkData o : mData.getNet()) {
prep = this.conn.prepareStatement(String
.format(INSERT_NETWORK_USAGE, this.nodeID, timeID, o
.toString()));
prep.addBatch();
// saveOrUpdateToDatabase(String.format(INSERT_NETWORK_USAGE,
// this.nodeID, timeID, o.toString()));
}
prep = this.conn.prepareStatement(String.format(
INSERT_MEMORY_USAGE, this.nodeID, timeID, mData.getMem()
.toString()));
// saveOrUpdateToDatabase(String.format(INSERT_MEMORY_USAGE,
// this.nodeID, timeID, mData.getMem().toString()));
conn.setAutoCommit(false);
int[] r = prep.executeBatch();
conn.setAutoCommit(true);
return true;
} catch (SQLException ex) {
Logger.getLogger(HistoricalDatabase.class.getName()).log(
Level.SEVERE, null, ex);
}
return false;
}
我對批次不熟悉,但看起來您正在爲預備聲明添加一個批次,但隨後用新的語句替換該預備聲明。最後,你指定準備一個新的預備語句,但不要調用addBatch(),然後調用executeBatch(),所以看起來你總是在執行最後一個準備語句的批處理,這是你永遠不會調用addBatch ()之前。 – Luciano
它也看起來像您正在使用preparedStatement作爲常規語句,因爲您正在設置SQL字符串中的參數,而不是使用PreparedStatement類提供的設置器。 – Luciano