目錄
一. JDBC批量添加數據
1. 什么是批量添加數據
2. 實現數據的批量添加
a. 方式一:不分塊
二.?JDBC事務處理
1. 什么是事務
2. JDBC事務處理實現
三. 總結
前言
本文來講解JDBC的批處理和事務處理
這對數據的安全性和準確性以及高效率提供很好的辦法
話不多說,即刻發車~
個人主頁:藝杯羹
系列專欄:JDBC
一. JDBC批量添加數據
1. 什么是批量添加數據
在JDBC中通過PreparedStatement的對象的addBatch()和executeBatch()方法進行數據的批量插入
- addBatch():把若干SQL語句裝載到一起,然后一次性傳送到數據庫執行
即是批量處理sql數據的。做數據的緩存 - executeBatch():會將裝載到一起的SQL語句執行
注意:
MySql默認情況下是不開啟批處理的
數據庫驅動從5.1.13開始添加了一個對rewriteBatchStatement的參數的處理,該參數能夠讓MySql開啟批處理。在url中添加該參數:rewriteBatchedStatements=true
Mysql的URL參數說明
參數名 | 取值范圍 | 作用說明 |
useUnicode | [true | false] | 是否使用編碼集,需配合 characterEncoding 參數使用 |
characterEncoding | [utf-8 | gbk | ...] | 編碼類型 |
useSSL | [true | false] | 是否使用SSL協議 |
rewriteBatchedStatements | [true | false] | 可以重寫向數據庫提交的SQL語句(開啟批處理) |
這些參數都是添加在如下圖的這個 連接數據庫的URL當中
添加參數的格式:使用 ?來開始,之后的元素用 & 來添加
例如:
jdbc:mysql://localhost:8080/students?? useSSL=false &?rewriteBatchedStatements = true
這樣就開啟了批處理
2. 實現數據的批量添加
像沒有學批處理的話,一般是的思路是,去使用for循環去和數據庫交互n次,批量添加1000條數據,就會執行1000次executeUpdate(),交互數據庫1000次,交互的次數越多,效率和性能就越低
因此,我們批處理,先進行緩存,最后再進行一個執行,那么這樣就和數據庫交互的次數就很少了,效率和性能也就隨之大大增強了
a. 方式一:不分塊
public void addBatch1(){Connection connection = null;PreparedStatement ps = null;try{// 建立連接connection = JdbcUtils.getConnection();// 創建PreparedStatementps = connection.prepareStatement("insert into students values(default, ?, ?)");for(int i = 0; i < 100; i++){// 綁定studentnameps.setString(1, "studentname"+i);// 綁定studentageps.setInt(2, 18);// 緩存ps.addBatch();}// 執行sqlps.executeBatch();}catch(Exception e){e.printStackTrace();}finally{JdbcUtils.closeResource(ps, connection);}}
這里批處理是,所有的全部緩存完后才開始執行SQL語句。例如,這里是添加一百個學生信息,那么是一次性添加完,最后來執行。這就是不分塊,而是整塊
但是如果數據量太大,例如百萬條數據,JVM的內存肯定是會耗盡的,為了避免,就可以使用分塊的邏輯來寫,也就是,到達了某一個數量,就要執行一次addBatch緩存中的數據
b. 方式二:分塊
public void addBatch1(){Connection connection = null;PreparedStatement ps = null;try{// 建立連接connection = JdbcUtils.getConnection();// 創建PreparedStatementps = connection.prepareStatement("insert into students values(default, ?, ?)");for(int i = 1; i <= 10000; i++){// 綁定studentnameps.setString(1, "studentname"+i);// 綁定studentageps.setInt(2, 18);// 緩存ps.addBatch();// 如果緩存了100條數據,就執行if(i % 100 == 0){// 執行sqlps.executeBatch();//清除緩存ps.clearBatch();}}}catch(Exception e){e.printStackTrace();}finally{JdbcUtils.closeResource(ps, connection);}}
二.?JDBC事務處理
1. 什么是事務
事務是指作為單個邏輯工作單元執行的一系列操作,要么完全地執行,要么完全地不執行。
只要有一方出錯,都不執行,這樣就確保了業務的正確性
事務操作流程:
- 開啟事務
- 提交事務
- 回滾事務(撤銷)
JDBC中事務處理特點
在JDBC中,使用Connection對象來管理事務,默認為自動提交事務。可以通過setAutoCommit(boolean autoCommit)方法設置事務是否自動提交,參數為boolean類型,默認值為true,表示自動提交事務,如果值為false則表示不自動提交事務,需要通過commit方法手動提交事務或者通過rollback方法回滾事務
2. JDBC事務處理實現
注:因為第一篇文章里已經用JDBC工具類里封裝了提交和回滾事務的方法,如果不清楚的話,來看第一篇文章
傳送門:JDBC
public void addBatch1(){Connection connection = null;PreparedStatement ps = null;try{// 建立連接connection = JdbcUtils.getConnection();// 設置事務的提交方式,將自動提交修改為手動提交connection.setAutoCommit(false);// 創建PreparedStatementps = connection.prepareStatement("insert into students values(default, ?, ?)");for(int i = 0; i < 100; i++){// 綁定studentnameps.setString(1, "studentname"+i);// 綁定studentageps.setInt(2, 18);// 加入緩存 ps.addBatch();}// 提交事務JdbcUtils.commit(connection);}catch(Exception e){e.printStackTrace();// 如果出現錯誤就執行回滾數據JdbcUtils.rollback(connection);}finally{JdbcUtils.closeResource(ps, connection);}}
三. 總結
希望本文能夠對你有所幫助😊