![](/img/trans.png)
[英]getGeneratedKeys() after PreparedStatement.executeBatch()
[英]Java PreparedStatement.executeBatch() in SQLite not working
我有以下方法。 帶注釋的方法saveOrUpdateToDatabase可以很好地執行,但是我想使用executeBatch。 我想念什么? 接收executeBatch()結果的int [] r始終為空...
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;
}
我想念什么? 接收executeBatch()結果的int [] r始終為空...
您使用的addBatch()
方法不正確。 在您的代碼中,您正在執行:
for (CpuData o : mData.getCpu()) {
// this is wrong, you can not prepare a new query each time
prep = this.conn.prepareStatement(INSERT_CPU_USAGE);
prep.setObject(1, this.nodeID);
prep.addBatch();
}
每次替換准備好的查詢。 每批只能調用一次prepareStatement(...)
。 您應該執行以下操作。 您將不得不將您的插入語句更改為?
參數:
PreparedStatement prep = conn.prepareStatement(INSERT_CPU_USAGE);
for (CpuData o : mData.getCpu()) {
prep.setObject(1, this.nodeID);
prep.setObject(2, timeID);
prep.setObject(3, o);
prep.addBatch();
}
prep.executeBatch();
請注意,僅使用了一個prepareStatement()
調用。 這個有?
然后在循環中使用prep.setString(1, ...)
分配SQL參數實體。 當該批次已准備好執行調用prep.executeBatch()
但是這是有史以來沒有更換prep
准備好的語句,你在做什么。
如果要在同一批處理中連續執行一系列不同的插入語句,則應考慮關閉自動提交,執行語句,調用提交,然后重新打開自動提交。 就像是:
conn.setAutoCommit(false);
// statements prepared and executed here
// maybe no need for batch operations
...
conn.commit();
conn.setAutoCommit(true);
除了我寫的評論,我還要冒險給出答案。 如果您嘗試這樣的事情怎么辦:
public boolean saveOrUpdate(MonitoredData mData) {
try {
PreparedStatement prep;
String timeID = this.getTimeLastRowID();
conn.setAutoCommit(false);
for (CpuData o : mData.getCpu()) {
prep = this.conn.prepareStatement(INSERT_CPU_USAGE);
prep.setObject(1, this.nodeID);
prep.setObject(2, timeID);
prep.setObject(3, o);
prep.addBatch();
// saveOrUpdateToDatabase(String.format(INSERT_CPU_USAGE,
// this.nodeID, timeID, o.toString()));
}
prep.executeBatch();
for (DiskData o : mData.getDisk()) {
prep = this.conn.prepareStatement(INSERT_DISK_USAGE);
prep.setObject(1, this.nodeID);
prep.setObject(2, timeID);
prep.setObject(3, o);
prep.addBatch();
// saveOrUpdateToDatabase(String.format(INSERT_DISK_USAGE,
// this.nodeID, timeID, o.toString()));
}
prep.executeBatch();
for (NetworkData o : mData.getNet()) {
prep = this.conn.prepareStatement(INSERT_NETWORK_USAGE);
prep.setObject(1, this.nodeID);
prep.setObject(2, timeID);
prep.setObject(3, o);
prep.addBatch();
// saveOrUpdateToDatabase(String.format(INSERT_NETWORK_USAGE,
// this.nodeID, timeID, o.toString()));
}
prep.executeBatch();
prep = this.conn.prepareStatement(INSERT_MEMORY_USAGE);
prep.setObject(1, this.nodeID);
prep.setObject(2, timeID);
prep.setObject(3, o);
prep.executeUpdate();
// saveOrUpdateToDatabase(String.format(INSERT_MEMORY_USAGE,
// this.nodeID, timeID, mData.getMem().toString()));
conn.setAutoCommit(true);
return true;
} catch (SQLException ex) {
Logger.getLogger(HistoricalDatabase.class.getName()).log(
Level.SEVERE, null, ex);
}
return false;
}
您可能需要修改常量中定義的那些SQL查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.