一、Statement与PreparedStatement的选择

PrepardStatement继承于Statement,主要区别点是PreparedStatement实现了SQL预编译,从而一定程度上避免了SQL注入问题。因为PreparedStatement实现了SQL预编译,在批量插入数据时,SQL服务端不会重复解析预编译部分的SQL语句,只是实现了占位符的填充,SQL语句执行上优于Statement,所以在jdbc中实现高校的批量插入一般选用PreparedStatement。

二、一般解决思路

在通常情况下都是处理SQL语句后就向SQL服务端提交一次数据,这样不仅占用服务资源而且效率也会非常的慢,所以我用使用一个容器把预处理后的SQL语句放在容器中,当达到容器设定的容量后再一同提交至SQL服务器,减少了提交次数,降低了服务资源的占用。使用这个思想,JDBC提供了批处理语句。


JDBC的批处理语句包括下面三个方法:

  • addBatch(String):添加需要批处理的SQL语句或参数;
  • executeBatch():执行批处理语句;
  • clearBatch():清空缓存的数据
Connection conn = JDBCUtils.getConnection(); // 获得链接
String sql = "insert into demo(num) values(?)";
PreparedStatement prs = conn.PreparedStatement(sql); for (int i = 1;i <= 20000;i++) {prs.setString(1,"第"+i+"次");prs.addBatch(); // 将处理后的SQL都装在一个容器中if (i % 500 == 0) {ps.executeBatch(); // 提交ps.clearBatch(); // 清空容器}
// 不适用普通的excute()执行

三、通过SQL服务商提供属性增加效率

1、开启批处理

mysql服务器默认情况下是关闭批处理的,我们需要通过url参数告知mysql服务器该条连接启用批处理。在创建连接的url中添加如下参数:

?rewriteBatchedStatements=true

例如:jdbc:mysql://localhost:3306/demo?rewriteBatchedStatements=true

2、借用数据库的事务

对上文代码块的改进:

Connection conn = JDBCUtils.getConnection(); // 获得链接conn.setAutoCommit(false); // 设置不自动提交 默认下mysql是自动提交的String sql = "insert into demo(num) values(?)";
PreparedStatement prs = conn.PreparedStatement(sql); for (int i = 1;i <= 20000;i++) {prs.setString(1,"第"+i+"次");prs.addBatch(); // 将处理后的SQL都装在一个容器中if (i % 500 == 0) {ps.executeBatch(); // 提交ps.clearBatch(); // 清空容器}// 不适用普通的excute()执行conn.commit(); // 提交事务

至此通过三个方式的综合使用,可以提高jdbc批量插入数据的效率。

jdbc高效的批量插入数据相关推荐

  1. 【JDBC】PreparedStatement实现批量插入数据

    题目:[JDBC]PreparedStatement实现批量插入数据 前言: PreparedStatement除了解决Statement的拼串.sql注入问题之外,还可以实现以下操作 Prepare ...

  2. 【JDBC技术】终于知道Java底层是如何连接数据库了!——(5)批量插入数据

    JDBC 核心技术解析 文章目录 JDBC 核心技术解析 批量插入 1. 批量执行SQL语句 2. 高效的批量插入 2.1 实现层次一:使用Statement 2.2 实现层次二:使用Prepared ...

  3. JDBC学习总结(二)JDBC操作Blob类型字段高效的批量插入JDBC处理数据库事务将多个SQL看成一个事务执行数据库连接池C3P0DBCPDruidDBUtils工具类实现CRUD

    JDBC学习总结(二)JDBC操作Blob类型字段/高效的批量插入/JDBC处理数据库事务/将多个SQL看成一个事务执行/数据库连接池C3P0/DBCP/Druid/DBUtils工具类实现CRUD ...

  4. JDBC 批量插入数据

    当需要批量插入数据到数据库时,我们可以利用基础的Statement或PreparedStatement外加for循环来实现操作,但这种方式效率奇低. 因此,当需要成批插入或者更新记录时,我们可以利用J ...

  5. JDBC executeBatch批量插入数据

    JDBC executeBatch批量插入数据 JDBC executeBatch批量插入数据 JDBC executeBatch批量插入数据 con.setAutoCommit(false); 项目 ...

  6. mysql如何高效批量插入数据

    mysql如何高效批量插入数据 1.一种可以再代码中循环着执行单条插入数据的语句,这种效率太差. insert into table ([列名],[列名]) values ([列值],[列值])); ...

  7. MySQL批量插入数据的几种方法

    最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别 别的先不说,先上一段代码与君共享 方法一: package com.bigdata; ...

  8. Java通过Mybatis实现批量插入数据到Oracle中

    最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式: 结合网上资料,写了个小demo,文章末尾附上demo下载地址 1.新建项目:项目目 ...

  9. MyBatis直接执行SQL查询及批量插入数据

    转:http://www.cnblogs.com/mabaishui/archive/2012/06/20/2556500.html 一.直接执行SQL查询: 1.mappers文件节选 <re ...

最新文章

  1. Activity动画效果笔记
  2. Git之签署工具GPG的安装和使用
  3. Microsoft.Practices.EnterpriseLibrary连接Oracle
  4. 札记__ADT:URL,Lua:strlen方法
  5. kali linux 双显卡,Kali上双显卡驱动的安装
  6. kafka服务器死机消息,当kafka集群其中一台宕机后,会怎么样?
  7. MAVEN 私有仓库库迁移
  8. java循环队列_Java 循环队列的实现
  9. P3383 【模板】线性筛素数
  10. 模型计算量(FLOPs)和参数量(Params)的理解
  11. 超轻简洁个人引导页网站源码
  12. 交付方式 saas_扩展和交付SaaS启动的最佳方法
  13. Bailian4129 变换的迷宫【BFS】
  14. 什么是云存储技术与云存储服务?
  15. Security+ 学习笔记50 取证技术
  16. VRRP技术原理与注意点
  17. 【SQL】Case语句的用法实例
  18. workstation服务重启后自动停止,需要手动启动,解决方案
  19. 原生 html 绘制表格
  20. xml文件导入wps_#WPS表格怎么导入XML数据?#excel怎样导入wps表格数据

热门文章

  1. Android Studio LayoutInspector 超时错误解决
  2. 搭建达梦数据守护集群
  3. 学着爬取了某 Hub 资源,只为撸这个鉴黄平台!
  4. 推荐几个前端大佬,干货超多!
  5. LT2611UX-LVDS转HDMI2.0转换器,支持高达6Gbps的数据速率
  6. 2021-07-26 SEO优化_网页关键词布局详解
  7. unknown media type in type 'all/all'
  8. SRIO——DIO通信模式
  9. godot切换父节点
  10. 根据面积均分球面 c++示意代码