JDBC的批量插入操作
2013-07-08 13:51
411 查看
在今天之前,当我遇到需要使用JDBC对数据库进行批量插入操作的时候,我使用的方法如下:
①使用Connection建立数据库连接;
②使用PreparedStatement提交SQL语句,将数据插入;
③关闭数据库连接,释放资源。
但是今晚,我遇到一个问题,需要对MySQL数据库批量插入10000条记录,于是,我将插入操作封装成了一个方法,然后调用,没插入一条记录,都要打开、关闭一次数据库,结果就是,等着一万条记录插入数据库之后,时间居然用了6分半钟。这是不能容忍的,用户不能等待这么久的时间。于是我就寻找JDBC批量插入的方法,参考了一篇博文,地址如下:
三种JDBC批量插入编程方法的比较
下面贴出一种方法,并作简要的说明。
说明下在建Statement的时候,后面两个参数的意义:
第一个参数指定 ResultSet 的类型。其选项有:
TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_INSENSITIVE:允许在列表中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。
第二个参数设置 ResultSet 的并发性,该参数确定是否可以更新 ResultSet。其选项有:
CONCUR_READ_ONLY:这是缺省值,指定不可以更新
ResultSet CONCUR_UPDATABLE:指定可以更新 ResultSet
需要说明的一点是,使用批量插入之前,请将JDBC的自动提交取消:
使用JDBC的批量提交,速度很快,同样是插入10000条记录,时间只用了1.7s
下面是使用Statement的批量插入:
①使用Connection建立数据库连接;
②使用PreparedStatement提交SQL语句,将数据插入;
③关闭数据库连接,释放资源。
但是今晚,我遇到一个问题,需要对MySQL数据库批量插入10000条记录,于是,我将插入操作封装成了一个方法,然后调用,没插入一条记录,都要打开、关闭一次数据库,结果就是,等着一万条记录插入数据库之后,时间居然用了6分半钟。这是不能容忍的,用户不能等待这么久的时间。于是我就寻找JDBC批量插入的方法,参考了一篇博文,地址如下:
三种JDBC批量插入编程方法的比较
下面贴出一种方法,并作简要的说明。
public void batchInsert() { Connection conn = DatabaseUtil.getConnection(); PreparedStatement prest = null; try { conn.setAutoCommit(false); String sql = "insert into test values(?,?,?,?,?,?)"; prest = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); for (int i = 0; i < 10000; i++) { prest.setInt(1, 1); prest.setInt(2, 2); prest.setInt(3, 3); prest.setInt(4, 4); prest.setInt(5, 5); prest.setInt(6, 6); prest.addBatch(); } prest.executeBatch(); conn.commit(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DatabaseUtil.close(null, prest, conn); } }
说明下在建Statement的时候,后面两个参数的意义:
第一个参数指定 ResultSet 的类型。其选项有:
TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_INSENSITIVE:允许在列表中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。
第二个参数设置 ResultSet 的并发性,该参数确定是否可以更新 ResultSet。其选项有:
CONCUR_READ_ONLY:这是缺省值,指定不可以更新
ResultSet CONCUR_UPDATABLE:指定可以更新 ResultSet
需要说明的一点是,使用批量插入之前,请将JDBC的自动提交取消:
conn.setAutoCommit(false);
使用JDBC的批量提交,速度很快,同样是插入10000条记录,时间只用了1.7s
下面是使用Statement的批量插入:
public void batchInsert() { Connection conn = DatabaseUtil.getConnection(); Statement stmt = null; try { conn.setAutoCommit(false); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); for(int i = 0; i < 10000; i++){ stmt.addBatch("INSERT INTO test VALUES(1,2,3,4,5,6)"); } stmt.executeBatch(); conn.commit(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ // TODO Auto-generated catch block e.printStackTrace(); DatabaseUtil.close(null, stmt, conn); } }
相关文章推荐
- JDBC操作Vertica数据库,用PreparedStatements对象实现批量插入数据
- Spring JDBC 常用批量操作及插入操作
- 初学JDBC,获取插入记录的主键、执行批量操作
- JDBC的批量插入操作
- 初学JDBC,获取插入记录的主键、执行批量操作
- 使用JDBC在MySQL数据库中快速批量插入数据
- Spring 对JDBC操作(实现增删改查,批量添加功能)
- 3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的区别,sql文件导入
- 使用oledb对数据库进行增删改查及批量插入操作
- 使用JDBC在MySQL数据库中快速批量插入数据
- Java 3种批量插入更新操作的效率横向比较
- Hibernate批处理操作优化 (批量插入、更新与删除)
- JDBC的批量批量插入
- Spring JdbcTemplate 批量插入或更新操作
- 启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
- Java JDBC 批量插入执行时问题
- JDBC连接oracle数据库,并实现批量插入
- MyBatis魔法堂:Insert操作详解(返回主键、批量插入)
- hibernate3 的常用操作(批量删除,批量插入,关联查询) (未测试)
- Hibernate批处理操作优化 (批量插入、更新与删除)