批量插入性能分析:仅仅针对性能
1.使用Statement对象,一次一个,循环插入
2.使用PreparedStatement对象,一次一个,循环插入
3.使用PreparedStatement对象,使用addBatch(),executeBatch(),clearBatch()实现批量插入
注意事项:
1)数据库的驱动需要是5.1.37之后的版本,否则不支持批量操作
2)mysql数据库默认不开启批量操作,需要在数据库的url后面加上:?rewriteBatchedStatements=true
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
4.使用批量插入的同时加上事务管理,一次性提交。
分析一:使用Statement,一次一个,循环插入
缺点:
1.每个sql语句都需要进行字符串拼接:效率极差
2.可能造成内存溢出(sql字符串对象太多)
3.每次执行一次,数据库每次都要编译一遍sql语句再执行:效率极差
分析二:使用PreparedStatement对象,一次一个,循环插入
缺点:
1.每次执行一次,数据库都要执行一次语句:效率差
优点:
1.预编译sql语句,省却了数据库多次编译sql语句,只需要一条sql语句,剩下的填充参数即可
分析三:使用PreparedStatement对象,并使用addBatch(),executeBatch(),clearBatch()实现批量插入
优点:
1.每次都是多个sql语句一起执行,而且不需要多次 编译,大大节省了系统开销,并增加的插入速度,推荐使用
分析四:在3的基础上使用事务
优点:一次性将事务中批量插入的数据,持久化到数据库中,不需要多次提交,大大加快的数据的持久化速度和安全性。
参考代码如下(工具类没给,异常未处理,为了简化代码,勿怪)
@Test public void test() throws Exception { Connection connection = JDBCUtils.getConnection(); //获取连接对象 connection.setAutoCommit(false); //设置事务不自动提交 String sql = "insert into goods(`name`) values(?)";//预编译sql语句 PreparedStatement ps = connection.prepareStatement(sql); for(int i = 0 ; i< 2000000 ; i++){ ps.setObject(1,"name"+i); //填充参数 ps.addBatch(); //攒sql if(i % 5000 == 0){ ps.executeBatch(); ps.clearBatch(); } } ps.executeBatch();//防止漏掉数据 connection.commit();//提交事务 JDBCUtils.close(connection,ps);//关闭资源 }