MySQL多线程完成10万条数据插入数据库

package com.eshore.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;

public class Threadtest extends Thread {
	public void run() {
		String url = "jdbc:mysql://ip:port/test";
		String name = "com.mysql.jdbc.Driver";
		String user = "账号";
		String password = "密码";
		Connection conn = null;
		try {
			Class.forName(name);
			conn = DriverManager.getConnection(url, user, password);// 获取连接
			System.out.println("数据库连接成功");
			conn.setAutoCommit(false);// 关闭自动提交,不然conn.commit()运行到这句会报错
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		// 开始时间
		Long begin = new Date().getTime();
		// sql前缀
		String prefix = "INSERT INTO test_teacher (name,password,sex,description,url,schoolname,remark) VALUES ";
		try {
			// 保存sql后缀
			StringBuffer suffix = new StringBuffer();
			// 设置事务为非自动提交
			conn.setAutoCommit(false);
			// 比起st,pst会更好些

			PreparedStatement pst = (PreparedStatement) conn
					.prepareStatement("");// 准备执行语句
			// 外层循环,总提交事务次数
			for (int i = 1; i <= 10; i++) {
				suffix = new StringBuffer();
				// 第j次提交步长
				for (int j = 1; j <= 10000; j++) {
					// 构建SQL后缀
					suffix.append("('" + i * j + "','123456'" + ",'男'"
							+ ",'教师'" + ",'www.bbb.com'" + ",'Java大学'"
							+ ",'备注'" + "),");
				}
				// 构建完整SQL
				String sql = prefix + suffix.substring(0, suffix.length() - 1);
				// 添加执行SQL
				pst.addBatch(sql);
				// 执行操作
				pst.executeBatch();
				// 提交事务
				conn.commit();
				// 清空上一次添加的数据
				suffix = new StringBuffer();
			}

			// 头等连接
			pst.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		// 结束时间
		Long end = new Date().getTime();
		// 耗时
		System.out.println("10万条数据插入花费时间 : " + (end - begin) / 1000 + " s"
				+ "  插入完成");
	}

	public static void main(String[] args) {
		for (int i = 1; i <= 4; i++) {
			new Threadtest().start();
		}
	}
}

 数据库表结构:

create table test_teacher(
    name        VARCHAR(100),
    password    VARCHAR(100),
    sex         VARCHAR(100),
    description VARCHAR(100),
    url         VARCHAR(100),
    schoolname  VARCHAR(100),
    remark      VARCHAR(100)
);

 

 总结:使用多线程进行大量数据的入库操作时,其速度的快慢由数据库服务器的配置和本地系统的配置两方面决定的。

  MySQL多线程完成10万条数据插入数据库_第1张图片

 

你可能感兴趣的:(MySQL)