读书人

小弟我和JAVA数据库操作的那些事儿(3

发布时间: 2012-12-23 11:28:15 作者: rapoo

我和JAVA数据库操作的那些事儿(3)

??? 在前面的两篇文章中,第一篇主要是讲了在jdbc编程中容易碰到的几个问题,以及大致的解决方法。第二篇从代码上实现了第一篇的一些方法,并且对批处理进行了一些描述。在批处理的过程中,我并没有和事务的概念放在一起,因为我发现,这两个概念往往会引起混淆。因为jdbc的批处理是jdbc层面上的,而事务是数据库层面上的,如果写一个存储过程的话,这两者是一样的,即到了一批再commit,而在jdbc编程就是两个层面了。比如下面的代码:

public void addEmployees(Connection conn, List<Employee> empList,        int batchSize) throws SQLException {long bt = System.currentTimeMillis();PreparedStatement stmt = null;// 设置conn自动提交为false,而由程序在需要的地方进行commit或者rollbackconn.setAutoCommit(false);//在这里设置一个Savepoint,以便在rollback的时候回滚到这时的状态Savepoint sp = conn.setSavepoint();try {String sql = SqlParser.getInstance().getSql("Employee.insert");stmt = conn.prepareStatement(sql);int count = 0;for (Employee emp : empList) {stmt.setInt(1, emp.getId());stmt.setString(2, emp.getName());stmt.setInt(3, emp.getDepartment().getId());stmt.setString(4, emp.getDescription());stmt.addBatch();count++;if (count % batchSize == 0) {stmt.executeBatch();// 注意,如果不加conn.commit()方法,即使我用stmt.executeBatch(),也不会真正提交到数据库conn.commit();}}stmt.executeBatch();// 虽然我在上面多次调用executeBatch(),但都没有真正提交到数据库,只有在conn.commit()之后才算真正提交conn.commit();} catch (SQLException e) {//回滚到Savepoint那个点conn.rollback(sp);} finally {long et = System.currentTimeMillis();System.out.println(String.format("用时%dms", et - bt));DBUtil.close(stmt);DBUtil.close(conn);}}
1 楼 he_wen 2011-10-23 能不能加一下我的QQ 493451161 想跟你详细了解一下 可以吗? 2 楼 lwjlaser 2011-10-27 这篇博客第一个示例代码中,当达到批量提交的时候的conn.commit(); 被注释掉了,麻烦修正一下。 3 楼 lettoo 2011-10-27 lwjlaser 写道这篇博客第一个示例代码中,当达到批量提交的时候的conn.commit(); 被注释掉了,麻烦修正一下。
这里我就是要举例说明如果不加commit,不能写到数据库,但在最后commit才会提交到数据库。谢谢回复。 4 楼 lwjlaser 2011-10-27 lettoo 写道lwjlaser 写道这篇博客第一个示例代码中,当达到批量提交的时候的conn.commit(); 被注释掉了,麻烦修正一下。
这里我就是要举例说明如果不加commit,不能写到数据库,但在最后commit才会提交到数据库。谢谢回复。
这样的话在测试的时候batchSize无论是多少,都是在1000条的时候执行commit,这样不同的batchSize测试的结果就不准确了

读书人网 >其他数据库

热点推荐