一、单线程(单条循环)插入50000条记录:

每执行一次就要访问一次数据库

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class Test {public static void main(String[] args) {Connection conn;Statement stmt;ResultSet rs = null;String url = "jdbc:sqlserver://localhost:1433;DatabaseName=test;";String sql = "insert into student(name,age) values('wang',12)";try {// 连接数据库conn = DriverManager.getConnection(url, "sa", "123456");// 建立Statement对象stmt = conn.createStatement();/*** Statement createStatement() 创建一个 Statement 对象来将 SQL 语句发送到数据库。*/// 执行数据库查询语句long starttime=System.currentTimeMillis();for(int i=0; i<50000;i++){stmt.executeUpdate(sql);}long spendtime=System.currentTimeMillis()-starttime;System.out.println( "单线程批处理花费时间:"+spendtime);/*** ResultSet executeQuery(String sql) throws SQLException 执行给定的 SQL* 语句,该语句返回单个 ResultSet 对象*/if (rs != null) {rs.close();rs = null;}if (stmt != null) {stmt.close();stmt = null;}if (conn != null) {conn.close();conn = null;}} catch (SQLException e) {e.printStackTrace();System.out.println("数据库连接失败");}        }
}

二、单线程(批处理)插入50000条记录:

stmt.addBatch():把要执行的多条sql语句放在一起,通过stmt.executeBatch()只访问一次数据库,就前面的多条sql语句一起插入

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class Test {public static void main(String[] args) {Connection conn;Statement stmt;ResultSet rs = null;String url = "jdbc:sqlserver://localhost:1433;DatabaseName=test;";String sql = "insert into student(name,age) values('wang',12)";try {// 连接数据库conn = DriverManager.getConnection(url, "sa", "123456");// 建立Statement对象stmt = conn.createStatement();/*** Statement createStatement() 创建一个 Statement 对象来将 SQL 语句发送到数据库。*/// 执行数据库查询语句long starttime=System.currentTimeMillis();for(int i=0; i<50000;i++){stmt.addBatch("insert into student(name,age) values('wang',12)"); }stmt.executeBatch();long spendtime=System.currentTimeMillis()-starttime;System.out.println( "单线程批处理花费时间:"+spendtime);/*** ResultSet executeQuery(String sql) throws SQLException 执行给定的 SQL* 语句,该语句返回单个 ResultSet 对象*/if (rs != null) {rs.close();rs = null;}if (stmt != null) {stmt.close();stmt = null;}if (conn != null) {conn.close();conn = null;}} catch (SQLException e) {e.printStackTrace();System.out.println("数据库连接失败");}  }
}

执行后会发现:时间缩短很多

三、多线程(单条循环)插入50000条记录:

启动5个线程,每个线程插入10000条记录

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;public class InsertTest {private String url="jdbc:sqlserver://localhost:1433;DatabaseName=test;";private String user="sa";private String password="123456";public Connection getConnect(){Connection con = null;try {Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");con=DriverManager.getConnection(url, user, password);} catch (Exception e) {e.printStackTrace();}return con;}public void multiThreadImport( final int ThreadNum){final CountDownLatch cdl= new CountDownLatch(ThreadNum);long starttime=System.currentTimeMillis();for(int k=1;k<=ThreadNum;k++){new Thread(new Runnable() {@Overridepublic void run() {Connection con=getConnect();try {Statement st=con.createStatement();for(int i=1;i<=10000;i++){//st.addBatch("insert into student(name,age) values('wang',12)");st.executeUpdate("insert into student(name,age) values('wang',12)");}//st.executeBatch();cdl.countDown();} catch (Exception e) {}finally{try {con.close();} catch (SQLException e) {e.printStackTrace();}}}}).start();}try {cdl.await();long spendtime=System.currentTimeMillis()-starttime;System.out.println( ThreadNum+"个线程花费时间:"+spendtime);} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {InsertTest ti=new InsertTest();ti.multiThreadImport(5);}
}

四、多线程(批处理)插入50000条记录:

启动5个线程

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;public class InsertTest {private String url="jdbc:sqlserver://localhost:1433;DatabaseName=test;";private String user="sa";private String password="Rfid123456";public Connection getConnect(){Connection con = null;try {Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");con=DriverManager.getConnection(url, user, password);} catch (Exception e) {e.printStackTrace();}return con;}public void multiThreadImport( final int ThreadNum){final CountDownLatch cdl= new CountDownLatch(ThreadNum);//定义线程数量long starttime=System.currentTimeMillis();for(int k=1;k<=ThreadNum;k++){new Thread(new Runnable() {@Overridepublic void run() {Connection con=getConnect();try {Statement st=con.createStatement();for(int i=1;i<=50000/ThreadNum;i++){st.addBatch("insert into student(name,age) values('wang',12)");if(i%500 == 0){st.executeBatch();}}cdl.countDown(); //执行完一个线程,递减1} catch (Exception e) {}finally{try {con.close();} catch (SQLException e) {e.printStackTrace();}}}}).start();}try {cdl.await(); //前面线程没执行完,其他线程等待,不往下执行long spendtime=System.currentTimeMillis()-starttime;System.out.println( ThreadNum+"个线程花费时间:"+spendtime);} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {InsertTest ti=new InsertTest();ti.multiThreadImport(5);}
}

CountDownLatch:这个类能够使一个线程等待其他线程完成各自的工作后再执行。

(1)它通过一个计数器来实现的,计数器的初始值为线程的数量。

CountDownLatch cdl= new CountDownLatch(ThreadNum)

(2)每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,

cdl.countDown();

(3)然后在闭锁上等待的线程就可以恢复执行任务。

cdl.await();

转载于:https://www.cnblogs.com/Donnnnnn/p/7514813.html

JDBC连接数据库:单线程、多线程、批处理插入数据的对比相关推荐

  1. Java JDBC批处理插入数据操作

    在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...

  2. java jdbc 批处理_Java JDBC批处理插入数据操作

    在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...

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

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

  4. jdbc连接mysql的配置文件_如何实现jdbc连接数据库并通过配置文件调用数据的方法(代码)...

    本篇文章给大家带来的内容是关于如何实现jdbc连接数据库并通过配置文件调用数据的方法(代码) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Dbutil类 package com. ...

  5. jdbc 3种获得mysql插入数据的自增字段值的方法_JDBC 3种获得mysql插入数据的自增字段值的方法...

    JDBC 3种获得mysql插入数据的自增字段值的方法. 1. Retrieving AUTO_INCREMENT Column Values using Statement.getGenerated ...

  6. jdbc 3种获得mysql插入数据的自增字段值的方法_【JDBC】向数据表插入数据时,自动获取生成的主键...

    数据表设计时,一般都会有一个主键(Key)(自己指定),有时也可以使用联合主键: 有许多数据库提供了隐藏列为表中的每行记录分配一个唯一键值(如:rowid): 当我们没有指定哪一列作为主键key时,数 ...

  7. LinkedList和ArrayList在尾部插入数据效率对比

    转载于:https://blog.csdn.net/qq_34144916/article/details/81154528 做这个实验之前,我的猜想的是:因为每次都是在尾部插入数据,而LinkedL ...

  8. 线程导入大数据入库_多线程批量插入数据小结

    在测试的过程中,无法避免的需要做一些性能压测,造数据的时长在此时就会备受关注.比如,造数据的时候用多线程还是多进程,用直接插入DB方式还是用先写文件后导入mysql的方式,写文件是写批量sql后面so ...

  9. Python连接数据库,向数据库插入数据

    用来测试的表结构 建表语句 CREATE TABLE test ( id int(10),value varchar(255)) ENGINE=InnoDB DEFAULT CHARSET=utf8; ...

最新文章

  1. 给表增加字段 本地测试正常 上传到服务器不正常
  2. 机器学习系列(8)_读《Nature》论文,看AlphaGo养成
  3. 理解分布式系统中的缓存架构(下)
  4. 全球农业南南合作论坛 唐盛尧:对话国际农民丰收节贸易会
  5. 项目开发管理工具---GitHub(一)
  6. python 服务端与c++客户端通讯_在C++与Python之间通信(IPC)
  7. Vijos1240 朴素的网络游戏
  8. AOP就是面向切面编程,我们可以从几个层面来实现AOP。 ![](https://upload-im
  9. 一、Linear Regression
  10. APP价格标签页面设计灵感!明码标价!
  11. 分区表PARTITION table
  12. 方案:软件集成测试工作流程指南
  13. C语言自学之路十四(详解C语言初阶结构体)
  14. java抽奖系统的设计参考文献,抽奖系统的设计与实现论文范文论文
  15. 算笔账:养老保险应该少交还是多交
  16. 原生js-购物车案例(四)增减商品数量,小计价格计算
  17. 【AMD显卡在WIndow10/11部署带GPU支持的深度学习环境(Tensorflow-DirectML篇)】
  18. 2021-11-06
  19. Java打印带边框的乘法口诀表_Java 面试 - 打印九九乘法口诀表
  20. 计算机二级c语言预测,计算机二级C语言考前预测上机试题及解析

热门文章

  1. JVM系列(三)— Java内存模型
  2. NSArray和NSString的联合使用
  3. Greenplum-概念篇
  4. Storm-源码分析-Topology Submit-Client
  5. 【Blog】Start My Journey In Cnblogs!
  6. 利用栈和队列将队列中的元素逆置☆
  7. MySQL Statement Cancellation Timer] but has failed to stop it.
  8. Http状态行和状态码介绍
  9. java线程wait()使一个线程一直运行,一直提供服务
  10. Android字节码替换方法,滴滴开源 DroidAssist : 轻量级 Android 字节码编辑插件