JDBC的批次更新

2021-07-22 07:08:54 字數 1952 閱讀 5769

對於資料庫的操作,每一次執行executeupdate(),其實都會向資料庫傳送一次sql,每次傳送都等同於通過網路進行了一次資訊傳送。而網路傳送資訊實際上必須啟動i/o、進行路由等動作,這樣進行大量更新,當執行的次數過多時,效能會很低,因此批量更新顯得尤為重要!

在使用批量更新之前我們進行大量資料更新是使用如下的**段:

statement stmt = conn.createstatement();

while( [condition is

true] )

我們可以通過使用addbatch()方法來收集sql,並使用executebatch()方法將所有的sql傳送出去,如下是通過statement 來進行批次更新:

statement stmt = conn.createstatement();

while( is

true> )

stmt.executebatch();

其中statement例項中的addbatch()是使用了arraylist來收集sql,mysql驅動程式的statement的原始碼如下所示:

public

void

addbatch(string sql) throws sqlexception

if(sql != null)

}}

順帶一提,當初找這個原始碼的時候發現在jdk中只有乙個statement的介面的宣告,並沒有具體的原始碼,由於不同的資料庫驅動廠商對介面的實現做了不同的處理,因而mysql的statement具體原始碼的實現在com.mysql.jdbc.statementimpl。

通過原始碼可以看出,addbatch()方法會收集所有的sql,最後串為一句sql,最終傳給資料庫,當大量更新產生時,這些sql語句就會通過一次網路傳送給資料庫,節省了i/o、網路路由等操作所消耗的時間。

需要注意的是批次更新限制了sql語句不能是select,否則會丟擲異常。

最終在資料庫執行時的順序就是addbatch()的順序,executebatch()會返回int , 代表每筆sql造成的資料異動列數。任何的sql錯誤都會丟擲batchupdateexception,可以使用該物件的getupdatecounts()取得int, 代表先前執行成功的sql所造成的異動筆數。

上面是乙個statement的例子,如果是使用preparedstatement進行批次更新,如下是乙個範例:

preparstatement stmt = conn.preparedstatemnt("insert into table(key, key) values(?, ?)");

while( is

true> )

stmt.executebatch(); //執行送出所有引數

mysql的preparedstatement實現類的addbatch()原始碼如下:

public

void

addbatch() throws sqlexception

for(int i = 0; i < this.parametervalues.length; ++i)

this.batchedargs.add(new preparedstatement.batchparams(this.parametervalues, this.parameterstreams, this.isstream, this.streamlengths, this.isnull));

}}

從原始碼可以看出addbatch()會收集佔位字元真正的數值,內部是使用arraylist來收集佔位字元實際的數值。

驅動程式本身是否支援批次更新也要注意,比如mysql要支援批次更新,必須在jdbc url上附加rewritebatchedstatements=true引數才有作用。

jdbc批量更新資料

有些時候,適合用jdbc。比如讀乙個大的excel檔案資料到資料庫 public static listwelfareimport multipartfile file,string id,string businesstype,iwelfaredao welfaredao throws ioexc...

關於JDBC中的ResultSet的更新資料操作

今天通過看api doc,才發現,還可以通過resultset來 更新資料 下面是api中的code fragment statement stmt con.createstatement resultset.type scroll insensitive,resultset.concur upda...

JDBC總結(不定時更新)

那些名詞 jdbc配置 註冊驅動器類 解壓jar包可以找到driver.class其路徑即是名字 法一 class.forname com.mysql.jdbc.driver 法二 system.setproperty jdbc.drivers com.mysql.jdbc.driver mysql...