一、单线程(单条循环)插入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() {
@Override
public 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() {
@Override
public 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();

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

  1. JDBC基础学习(五)—批处理插入数据

    一.批处理介绍      当需要成批插入或者更新记录时.可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率. JDBC的批量处理语句包括下 ...

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

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

  3. Java JDBC批处理插入数据操作(转)

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

  4. Oracle 插入数据效率对比

    oracle插入数据有多种方式: 将从多个表中查出来的数据插入到临时表中 数据行数 5189597 1.传统方式:直接将数据插入到表中 insert into LLB_BASIC_USER_D_TEM ...

  5. android批量插入数据效率对比

    对比在android中批量插入数据的3中方式对比(各插入1W条数据所花费的时间): 1. 一个一个插入 /** * 向表中插入数据 * * @param openHelper * @param app ...

  6. java的jdbc连接数据库,读取表中数据

    连接数据库操作步骤如下 架包 jar 建表 源码解析 1:架包 jar根据自己本版本选择正确jar包,本例采用maven 管理局,在pom.xml 中添加如下代码,自动下载架包 <depende ...

  7. Oracle 逐条和批量插入数据方式对比

    创建测试表 create table base_users ( userid         varchar2(16), username  varchar2(32), passwd      var ...

  8. EF批量插入数据耗时对比

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. 批量插入数据(基于Mybatis的实现-Oracle)

    前言:做一个数据同步项目,要求:同步数据不丢失的情况下,提高插入性能. 项目DB框架:Mybatis.DataBase:Oracle. -------------------------------- ...

随机推荐

  1. Java的三种代理模式(Proxy,CGLib)

    1.静态代理,这种不用说最不靠谱.每个类一个代理,代码量很大. 2.JDK代理.使用java.lang.reflect.Proxy进行代理,但是被代理的类必须要实现接口. 3.Cglib代理.不用实现 ...

  2. 日常英语---十、MapleStory/Monsters/Level 191-201(Sad Erda:向你发射炮弹进行攻击)

    日常英语---十.MapleStory/Monsters/Level 191-201(Sad Erda:向你发射炮弹进行攻击) 一.总结 一句话总结:一种悲伤的精神,形成于奥术之河,一个黑法师能够融合 ...

  3. Tomcat ----> 学习笔记

    源码之几个常见类和接口的关系 在学习Servlet的时候经常见到以下几个合成单词和非合成单词:Servlet.GenericServlet.HttpServlet.它们之间有联系的.接下来我把它们的联 ...

  4. LeetCode--844--比较含退格的字符串(java)

    给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = " ...

  5. 赵炯博士《Linux内核完全注释》

    赵炯:男,1963年10月5日出生,江苏苏州人,汉族. 同济大学机械工程学院机械电子教研室副教授,从事教学和科研工作. 现在主要为硕士和博士研究生开设<计算机通信技术>.<计算机控制 ...

  6. android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app

    开发中常常有打开本地浏览器加载url或者指定浏览器加载, 还有打开第三方app, 如 打开高德地图 百度地图等 在Android程序中我们可以通过发送隐式Intent来启动系统默认的浏览器. 如果手机 ...

  7. Count Up Down(上下计数)

    这个题目是 Kayak 发布的代码挑战题目. 最简单的描述就是不使用循环,输出 0 到 5,然后同样不是会用循环的方式再次输出 5 到 0. 英文描述 Part 1 Write a program t ...

  8. hdu6331 Walking Plan

    题意: sol: 考虑floyed 直接暴力做的话复杂度是kn^3会炸. 考虑一个比较神仙的分块做法. 注意到我们是可以直接求单独某个k的矩阵,使用矩阵快速幂即可(取min的矩阵乘法). 单独求一次的 ...

  9. 代码版本控制[version control]之Git

    如何多人协同开发同一个项目? 使用代码版本控制[version control]软件, 目前市面上比较流行的代码版本控制器有: git,svn,csv 1. 使用git管理代码版本 本项目使用git管 ...

  10. python基础之面向对象的多继承以及MRO算法

    内容梗概: 1. python多继承 2. python经典类的MRO 3. python新式类的MRO C3算法 1.python多继承 class Shen: def fly(self): pri ...