jdbc高效的批量插入数据
一、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高效的批量插入数据相关推荐
- 【JDBC】PreparedStatement实现批量插入数据
题目:[JDBC]PreparedStatement实现批量插入数据 前言: PreparedStatement除了解决Statement的拼串.sql注入问题之外,还可以实现以下操作 Prepare ...
- 【JDBC技术】终于知道Java底层是如何连接数据库了!——(5)批量插入数据
JDBC 核心技术解析 文章目录 JDBC 核心技术解析 批量插入 1. 批量执行SQL语句 2. 高效的批量插入 2.1 实现层次一:使用Statement 2.2 实现层次二:使用Prepared ...
- JDBC学习总结(二)JDBC操作Blob类型字段高效的批量插入JDBC处理数据库事务将多个SQL看成一个事务执行数据库连接池C3P0DBCPDruidDBUtils工具类实现CRUD
JDBC学习总结(二)JDBC操作Blob类型字段/高效的批量插入/JDBC处理数据库事务/将多个SQL看成一个事务执行/数据库连接池C3P0/DBCP/Druid/DBUtils工具类实现CRUD ...
- JDBC 批量插入数据
当需要批量插入数据到数据库时,我们可以利用基础的Statement或PreparedStatement外加for循环来实现操作,但这种方式效率奇低. 因此,当需要成批插入或者更新记录时,我们可以利用J ...
- JDBC executeBatch批量插入数据
JDBC executeBatch批量插入数据 JDBC executeBatch批量插入数据 JDBC executeBatch批量插入数据 con.setAutoCommit(false); 项目 ...
- mysql如何高效批量插入数据
mysql如何高效批量插入数据 1.一种可以再代码中循环着执行单条插入数据的语句,这种效率太差. insert into table ([列名],[列名]) values ([列值],[列值])); ...
- MySQL批量插入数据的几种方法
最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别 别的先不说,先上一段代码与君共享 方法一: package com.bigdata; ...
- Java通过Mybatis实现批量插入数据到Oracle中
最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式: 结合网上资料,写了个小demo,文章末尾附上demo下载地址 1.新建项目:项目目 ...
- MyBatis直接执行SQL查询及批量插入数据
转:http://www.cnblogs.com/mabaishui/archive/2012/06/20/2556500.html 一.直接执行SQL查询: 1.mappers文件节选 <re ...
最新文章
- Activity动画效果笔记
- Git之签署工具GPG的安装和使用
- Microsoft.Practices.EnterpriseLibrary连接Oracle
- 札记__ADT:URL,Lua:strlen方法
- kali linux 双显卡,Kali上双显卡驱动的安装
- kafka服务器死机消息,当kafka集群其中一台宕机后,会怎么样?
- MAVEN 私有仓库库迁移
- java循环队列_Java 循环队列的实现
- P3383 【模板】线性筛素数
- 模型计算量(FLOPs)和参数量(Params)的理解
- 超轻简洁个人引导页网站源码
- 交付方式 saas_扩展和交付SaaS启动的最佳方法
- Bailian4129 变换的迷宫【BFS】
- 什么是云存储技术与云存储服务?
- Security+ 学习笔记50 取证技术
- VRRP技术原理与注意点
- 【SQL】Case语句的用法实例
- workstation服务重启后自动停止,需要手动启动,解决方案
- 原生 html 绘制表格
- xml文件导入wps_#WPS表格怎么导入XML数据?#excel怎样导入wps表格数据