日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

java executebatch_JDBC批量执行executeBatch

發(fā)布時間:2024/9/15 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java executebatch_JDBC批量执行executeBatch 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

JDBC事務(wù)

在數(shù)據(jù)庫中,所謂事務(wù)是指一組邏輯操作單元,使數(shù)據(jù)從一種狀態(tài)變換到另一種狀態(tài)。為確保數(shù)據(jù)庫中數(shù)據(jù)的一致性,數(shù)據(jù)的操縱應(yīng)當(dāng)是離散的成組的邏輯單元:當(dāng)它全部完成時,數(shù)據(jù)的一致性可以保持,而當(dāng)這個單元中的一部分操作失敗,整個事務(wù)應(yīng)全部視為錯誤,所有從起始點以后的操作應(yīng)全部回退到開始狀態(tài)。

事務(wù)的操作:先定義開始一個事務(wù),然后對數(shù)據(jù)作修改操作,這時如果提交(COMMIT),這些修改就永久地保存下來,如果回退(ROLLBACK),數(shù)據(jù)庫管理系統(tǒng)將放棄您所作的所有修改而回到開始事務(wù)時的狀態(tài)。

事務(wù)的ACID屬性

1.?原子性(Atomicity)

原子性是指事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。

2.?一致性(Consistency)

事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)。(數(shù)據(jù)不被破壞)

3.?隔離性(Isolation)

事務(wù)的隔離性是指一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾,即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。

4.?持久性(Durability)

持久性是指一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來的其他操作和數(shù)據(jù)庫故障不應(yīng)該對其有任何影響。

在JDBC中,事務(wù)默認(rèn)是自動提交的,每次執(zhí)行一個?SQL?語句時,如果執(zhí)行成功,就會向數(shù)據(jù)庫自動提交,而不能回滾

為了讓多個SQL?語句作為一個事務(wù)執(zhí)行:

(1)執(zhí)行語句前調(diào)用Connection?對象的setAutoCommit(false);?以取消自動提交事務(wù)

(2)在所有的SQL?語句都成功執(zhí)行后,調(diào)用commit();?方法提交事務(wù)

(3)在出現(xiàn)異常時,調(diào)用rollback();?方法回滾事務(wù)。

JDBC批量執(zhí)行

當(dāng)需要成批插入或者更新記錄時。可以采用Java的批量更新機制,這一機制允許多條語句一次性提交給數(shù)據(jù)庫批量處理。通常情況下比單獨提交處理更有效率

JDBC的批量處理語句包括下面兩個方法:

addBatch(String):添加需要批量處理的SQL語句或是參數(shù);

executeBatch();執(zhí)行批量處理語句;

clearBatch();清除批量打包

通常我們會遇到兩種批量執(zhí)行SQL語句的情況:

多條SQL語句的批量處理;

for?(int?i = 1; i < 5000; i++) {

sql = "insert into person(id,name,email) values(" + i",'name" + i + "','email" + i + "')";

stmt.addBatch(sql);

if((i+1)%1000==0){

//批量處理

stmt.executeBatch();

/清除stmt中積攢的參數(shù)列表

stmt.clearBatch();

}

}

一個SQL語句的批量傳參;

for(int?i=1;i<100000;i++){

pstmt.setInt(1, i);

pstmt.setString(2, "name"+i);

pstmt.setString(3, "email"+i);

pstmt.addBatch();

if((i+1)%1000==0){

//批量處理

pstmt.executeBatch();

//清空pstmt中積攢的sql

pstmt.clearBatch();

}

}

JDBC執(zhí)行SQL語句,有兩個處理的接口,一個PreparedStatement,Statement,一般操作JDBC比較用得多的還是PreparedStatement

不過在執(zhí)行批量,PreparedStatement有點不夠Statement

ps = conn.prepareStatement(sql);

for(int i = 0;i<10;i++){

ps.setString(1,"1");

//PreparedStatement批處理方式一

ps.addBatch();

}

//PreparedStatement批處理方式二

ps.addBatch("靜態(tài)SQL");

ps.executeBatch();

這個是正常執(zhí)行的

可是把PreparedStatement放到里面就沒效了,以下:

for(int i = 0;i<10;i++){

ps = conn.prepareStatement(sql);

ps.setString(1,"1");

ps.addBatch();

}

ps.executeBatch();

Statement適合循環(huán)賦值到sql,代碼以下:

Statement st = conn.createStatement();

for(int i = 0;i<10;i++){

st.addBatch("靜態(tài)sql..........");

}

st.executeBatch();

這個是正常執(zhí)行所有的語句

總結(jié):造成這樣的原因是

Statement st = conn.createStatement();這里可以不放SQL語句

ps = conn.prepareStatement(sql);這個一定要放初始SQL語句

JDBC的批處理不能加入select語句,否則會拋異常:

java.sql.BatchUpdateException: Can not issue SELECT via executeUpdate().

at com.MySQL.jdbc.StatementImpl.executeBatch(StatementImpl.java:1007)

總結(jié)

以上是生活随笔為你收集整理的java executebatch_JDBC批量执行executeBatch的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。