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 }
批量操作

相关文章:

  • 2019-10-06
  • 2021-11-04
  • 2022-02-23
  • 2021-11-26
  • 2021-10-03
  • 2021-06-11
  • 2021-07-29
  • 2021-11-01
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-02-04
  • 2021-06-03
  • 2021-09-18
  • 2021-09-08
  • 2021-11-14
相关资源
相似解决方案