1.如何使用JDBC事务
(1)事务的四个特性:
一.原子性(Atomicity)
原子性是指事务是一个不可分割的单位,事务中的操作要么都发生,要么都不发生。
二.一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破坏)
三.隔离性(Isolation)
事务的隔离性是指一个事务的执行不被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
四.持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中的数据的改变就是永久性的,接下来的其操作和数据库故障不应该对其有任何影响。
在JDBC中,事务默认是自动提交的,每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
(2)取消JDBC默认的自动提交方式,改为手动提交
conn.setAutoCommit(false);
(3)多有JDBC操作都执行完毕后提交事务
conn.commit();
(4)有一个JDBC操作发生问题就回滚事务
conn.rollback();
(5)可以通过设置事务的保存点来灵活的进行控制(Savepoint).
Savepoint是java.sql包的一个接口,可以在回滚事务时引用当前事务中的保存点,将事务回滚到保存点,在该保存点之后所做的全部操作都将被撤销。
conn.setSavepoint();
2.JDBC批量操作
1 package cn.com.demo; 2 import java.io.BufferedReader; 3 import java.io.File; 4 import java.io.FileReader; 5 import java.sql.Connection; 6 import java.sql.PreparedStatement; 7 import java.sql.SQLException; 8 import java.sql.Timestamp; 9 import java.util.ArrayList; 10 import java.util.Iterator; 11 import java.util.List; 12 import java.util.regex.Pattern; 13 public class TestBatch { 14 private Connection conn = null; 15 private PreparedStatement pstmt = null; 16 public static void main(String[] args) { 17 TestBatch tb = new TestBatch(); 18 List<String> list = tb.readFile(); 19 Iterator<String> iter = list.iterator(); 20 while (iter.hasNext()) { 21 System.out.println(iter.next() + "\t"); 22 } 23 tb.updateSms(list); 24 } 25 public void updateSms(List<String> list) { 26 int i = 0; 27 long startTime = System.currentTimeMillis(); 28 try { 29 String sql = "insert into sendsms(name,sourcetel,desttel,senddate) values(?,?,?,?)"; 30 conn = DaoFactory.getConnection(); 31 conn.setAutoCommit(false);// 设置事务手动提交 32 pstmt = conn.prepareStatement(sql); 33 for (String tel : list) { // 循环获取手机号 34 pstmt.setString(1, "张苏纳"); 35 pstmt.setString(2, "15026470454"); 36 pstmt.setString(3, tel); 37 pstmt.setTimestamp(4, 38 new Timestamp(new java.util.Date().getTime())); 39 pstmt.addBatch();// 加入缓存 40 i++; 41 if (i % 10000 == 0) {// 10000保存一次 42 pstmt.executeBatch();// 批量处理 43 pstmt.clearBatch();// 清空pstmt中积攒的sql 44 } 45 // pstmt.executeUpdate();// 执行保存 46 } 47 pstmt.executeBatch();// 执行所有的sql语句 48 conn.commit(); // 提交事务 49 } catch (Exception e) { 50 try { 51 conn.rollback(); 52 } catch (SQLException e1) { 53 e1.printStackTrace(); 54 } 55 e.printStackTrace(); 56 } finally { 57 DaoFactory.closeAll(null, pstmt, conn); 58 } 59 long endTime = System.currentTimeMillis(); 60 long time = (endTime - startTime) / 1000; 61 System.out.println("耗时" + time + "秒。"); 62 } 63 // 读取号码文件 64 public List<String> readFile() { 65 List<String> list = new ArrayList<String>(); 66 File file = new File("E:" + File.separator + "测试.txt"); // 100000个手机号 67 try { 68 FileReader fileReader = new FileReader(file); 69 BufferedReader bufferedReader = new BufferedReader(fileReader); 70 while (bufferedReader.ready()) { 71 String tel = bufferedReader.readLine(); 72 if (tel.length() > 0) { 73 if (tel.contains(" ")) { 74 tel = tel.replace(" ", ""); 75 } 76 // 验证手机号 77 if (!Pattern.compile("^1[358]\\d{9}$").matcher(tel) 78 .matches()) { 79 System.out.println("手机号码格式不正确" + tel); 80 continue; 81 } 82 list.add(tel); 83 } 84 } 85 bufferedReader.close(); 86 fileReader.close(); 87 } catch (Exception e) { 88 e.printStackTrace(); 89 e.getMessage(); 90 } 91 return list; 92 } 93 }