JDBC之批量处理
一、批量处理JDBC语句提高处理速度
当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处
理。通常情况下比单独提交处理更有效率
JDBC的批量处理语句包括下面两个方法:
①addBatch(String):添加需要批量处理的SQL语句或是参数;
②executeBatch();执行批量处理语句;
通常我们会遇到两种批量执行SQL语句的情况:
①多条SQL语句的批量处理;
②一个SQL语句的批量传参;
二、示例代码
1 /**
2 * 使用批量处理
3 */
4 @Test
5 public void testBatch() {
6 Connection connection = null;
7 PreparedStatement preparedStatement = null;
8 String sql = null;
9
10 try {
11 connection = JDBCTools.getConnection();
12 JDBCTools.beginTx(connection);
13 sql = "INSERT INTO customers VALUES(?,?,?)";
14 preparedStatement = connection.prepareStatement(sql);
15 Date date = new Date(new java.util.Date().getTime());
16
17 long begin = System.currentTimeMillis();
18 for (int i = 0; i < 100000; i++) {
19 preparedStatement.setInt(1, i + 1);
20 preparedStatement.setString(2, "name_" + i);
21 preparedStatement.setDate(3, date);
22
23 // "积攒" SQL
24 preparedStatement.addBatch();
25
26 // 当 "积攒" 到一定程度, 就统一的执行一次. 并且清空先前 "积攒" 的 SQL
27 if ((i + 1) % 300 == 0) {
28 preparedStatement.executeBatch();
29 preparedStatement.clearBatch();
30 }
31 }
32
33 // 若总条数不是批量数值的整数倍, 则还需要再额外的执行一次.
34 if (100000 % 300 != 0) {
35 preparedStatement.executeBatch();
36 preparedStatement.clearBatch();
37 }
38
39 long end = System.currentTimeMillis();
40
41 System.out.println("Time: " + (end - begin)); // 569
42
43 JDBCTools.commit(connection);
44 } catch (Exception e) {
45 e.printStackTrace();
46 JDBCTools.rollback(connection);
47 } finally {
48 JDBCTools.releaseDB(null, preparedStatement, connection);
49 }
50 }
51
52 /**
53 * 使用PreparedStatement
54 */
55 @Test
56 public void testBatchWithPreparedStatement() {
57 Connection connection = null;
58 PreparedStatement preparedStatement = null;
59 String sql = null;
60
61 try {
62 connection = JDBCTools.getConnection();
63 JDBCTools.beginTx(connection);
64 sql = "INSERT INTO customers VALUES(?,?,?)";
65 preparedStatement = connection.prepareStatement(sql);
66 Date date = new Date(new java.util.Date().getTime());
67
68 long begin = System.currentTimeMillis();
69 for (int i = 0; i < 100000; i++) {
70 preparedStatement.setInt(1, i + 1);
71 preparedStatement.setString(2, "name_" + i);
72 preparedStatement.setDate(3, date);
73
74 preparedStatement.executeUpdate();
75 }
76 long end = System.currentTimeMillis();
77
78 System.out.println("Time: " + (end - begin)); // 9819
79
80 JDBCTools.commit(connection);
81 } catch (Exception e) {
82 e.printStackTrace();
83 JDBCTools.rollback(connection);
84 } finally {
85 JDBCTools.releaseDB(null, preparedStatement, connection);
86 }
87 }
88
89 /**
90 * 向 Oracle 的 customers 数据表中插入 10 万条记录
91 * 测试如何插入, 用时最短. 1. 使用 Statement.
92 */
93 @Test
94 public void testBatchWithStatement() {
95 Connection connection = null;
96 Statement statement = null;
97 String sql = null;
98
99 try {
100 connection = JDBCTools.getConnection();
101 JDBCTools.beginTx(connection);
102
103 statement = connection.createStatement();
104
105 long begin = System.currentTimeMillis();
106 for (int i = 0; i < 100000; i++) {
107 sql = "INSERT INTO customers VALUES(" + (i + 1) + ", 'name_" + i + "', '29-6月 -13')";
108 statement.addBatch(sql);
109 }
110 long end = System.currentTimeMillis();
111
112 System.out.println("Time: " + (end - begin)); // 39567
113
114 JDBCTools.commit(connection);
115 } catch (Exception e) {
116 e.printStackTrace();
117 JDBCTools.rollback(connection);
118 } finally {
119 JDBCTools.releaseDB(null, statement, connection);
120 }
121 }
通过代码,我们可以发现,很明显处理速度batch > PreparedStatement > Statement
如果,您对我的这篇博文有什么疑问,欢迎评论区留言,大家互相讨论学习。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博文感兴趣,可以关注我的后续博客,我是【AlbertRui】。转载请注明出处和链接地址,欢迎转载,谢谢!