mysql数据库100万条数据JDBC插入的各种方式效率对比。

本文主要是介绍mysql数据库100万条数据JDBC插入的各种方式效率对比。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

mysql数据库100万条数据JDBC插入的各种方式效率对比

  下面测试四个方式:

   1 、一条一条插入  166秒/10万

   2、jdbc采用事务提交  135秒/10万

   3、batch方式(内部实现方式-拼接values) 12.73秒/10万

   4、事务+batch方式   9.99秒/10万

package test.jbdc;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;import org.junit.Test;/*** 大数据量的插入---> 测试100万条数据  【一共5个字段的表】* 方法1、普通采用jdbc插入* 方法2、jdbc用事务进行提交  --> 事务提交是把语句一起执行* 方法3、batch语句   --> 内部实现是是把 values 后面的插入值变成成 values(,,,),(,,,,) :*/
public class BigDataTest {/*** 一、普通方式* 时间:10万条:16672ms 折合100万条 = 166.72秒 */@Testpublic void test1(){Connection conn = JDBCUtil.getConnection();PreparedStatement stmt  = null;long t1 = System.currentTimeMillis();try {stmt = conn.prepareStatement("insert into test_yxtj values(?,?,?,?,?)");for (int i = 0; i <100000; i++) {stmt.setInt(1, i);stmt.setFloat(2, i);stmt.setString(3, i+"");stmt.setInt(4, i);stmt.setInt(5, i);stmt.execute();}} catch (SQLException e) {e.printStackTrace();}finally {JDBCUtil.release(null, stmt, conn);}long t2 = System.currentTimeMillis();System.out.println((t2-t1));}/*** 二、事务提交 :* 时间:10万条:13558ms 折合100万条 = 135.5秒 */@Testpublic void test2(){Connection conn = JDBCUtil.getConnection();PreparedStatement stmt  = null;long t1 = System.currentTimeMillis();try {conn.setAutoCommit(false);stmt = conn.prepareStatement("insert into test_yxtj values(?,?,?,?,?)");for (int i = 0; i <100000; i++) {stmt.setInt(1, i);stmt.setFloat(2, i);stmt.setString(3, i+"");stmt.setInt(4, i);stmt.setInt(5, i);stmt.execute();}conn.commit();} catch (SQLException e) {e.printStackTrace();}finally {JDBCUtil.release(null, stmt, conn);}long t2 = System.currentTimeMillis();System.out.println((t2-t1));}/*** 三、批处理:* 特别注意:需要url参数加:rewriteBatchedStatements=true* url范例: jdbc:mysql://127.0.0.1/XXX?characterEncoding=UTF-8&rewriteBatchedStatements=true* 时间 : 10万条:1273ms 折合100万条 = 12.73秒 */@Testpublic void test3(){Connection conn = JDBCUtil.getConnection();PreparedStatement stmt  = null;long t1 = System.currentTimeMillis();try {stmt = conn.prepareStatement("insert into test_yxtj values(?,?,?,?,?)");for (int i = 0; i <100000; i++) {stmt.setInt(1, i);stmt.setFloat(2, i);stmt.setString(3, i+"");stmt.setInt(4, i);stmt.setInt(5, i);stmt.addBatch();}stmt.executeBatch();} catch (SQLException e) {e.printStackTrace();}finally {JDBCUtil.release(null, stmt, conn);}long t2 = System.currentTimeMillis();System.out.println((t2-t1));}/*** 四、事务+批处理并且分批执行* 结论:加事务时间无影响,但是分批次能提供效率的增加* 时间:100万条:9900ms 折合100万条 = 9.99秒 * 时间:500万条:46943ms = 47秒*/@Testpublic void test4(){Connection conn = JDBCUtil.getConnection();PreparedStatement stmt  = null;long t1 = System.currentTimeMillis();try {//conn.setAutoCommit(false);  /**取消事务对时间无太大影响!!*/stmt = conn.prepareStatement("insert into test_yxtj values(?,?,?,?,?)");//            for (int i = 1; i <=100; i++) { //1万条一次
//                for (int j = 1; j <=10000; j++) {
//                    stmt.setInt(1, ((i-1)*10000)+j);
//                    stmt.setFloat(2, ((i-1)*10000)+j);
//                    stmt.setString(3, ((i-1)*10000)+j+"");
//                    stmt.setInt(4, ((i-1)*10000)+j);
//                    stmt.setInt(5, ((i-1)*10000)+j);
//                    stmt.addBatch();
//                }
//                stmt.executeBatch();
//                stmt.clearBatch(); /**清除缓存*/
//                System.out.println("执行到第"+i+"外循环");
//            }//conn.commit();//-------> 上面固定了100万条,假如不确定多少数据量的情况,就不好指定2层循环.可采用下面的样子int size = 5000000;for (int i = 0; i < size; i++) {stmt.setInt(1, i);stmt.setFloat(2, i);stmt.setString(3, i+"");stmt.setInt(4, i);stmt.setInt(5, i);stmt.addBatch();if(i%10000==0||i==size-1){ //1万次一条,或者最后一次进行提交。stmt.executeBatch();stmt.clearBatch(); /**清除缓存*/System.out.println("执行到第"+i/10000+"外循环");}}} catch (SQLException e) {
//            try {
//                conn.rollback();
//            } catch (SQLException e1) {
//                e1.printStackTrace();
//            }}finally {JDBCUtil.release(null, stmt, conn);}long t2 = System.currentTimeMillis();System.out.println((t2-t1));}}

这篇关于mysql数据库100万条数据JDBC插入的各种方式效率对比。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/481885

相关文章

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal