`

Java不写文件,LOAD DATA LOCAL INFILE大批量导入数据到MySQL的实现

 
阅读更多

大家都知道当插入大批量数据MySQL的时候,
MySQL使用load data local infile 从文件中导入数据比insert语句要快,MySQL文档上说要快20倍左右。
但是这个方法有个缺点,就是导入数据之前,必须要有文件,也就是说从文件中导入。这样就需要去写文件,
以及文件删除等维护。某些情况下,比如数据源并发的话,还会出现写文件并发问题,很难处理。
那么有没有什么办法,可以达到同样的效率,直接从内存(IO流中)中导入数据,而不需要写文件呢?
前段时间,去MySQL社区的时候发现了这样一个方法:setLocalInfileInputStream(),此方法位于com.mysql.jdbc.PreparedStatement 类中

下面是具体实现:

通过使用 MySQL JDBC 的setLocalInfileInputStream 方法实现从java InputStream中load data local infile 到MySQL数据库中。

 

准备测试表 
SQL如下:

use test;
CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a` int(11) NOT NULL,
  `b` bigint(20) unsigned NOT NULL,
  `c` bigint(20) unsigned NOT NULL,
  `d` int(10) unsigned NOT NULL,
  `e` int(10) unsigned NOT NULL,
  `f` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `a_b` (`a`,`b`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

 Java代码如下:

package com.dbTools.DBTools;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

import org.apache.log4j.Logger;


public class BulkLoadData2MySQL {

	private static final Logger logger = Logger.getLogger(BulkLoadData2MySQL.class);
	private JdbcTemplate jdbcTemplate;
	private Connection conn = null;

	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	public static InputStream getTestDataInputStream() {
		StringBuilder builder = new StringBuilder();
		for (int i = 1; i <= 10; i++) {
			for (int j = 0; j <= 10000; j++) {

				builder.append(4);
				builder.append("\t");
				builder.append(4 + 1);
				builder.append("\t");
				builder.append(4 + 2);
				builder.append("\t");
				builder.append(4 + 3);
				builder.append("\t");
				builder.append(4 + 4);
				builder.append("\t");
				builder.append(4 + 5);
				builder.append("\n");
			}
		}
		byte[] bytes = builder.toString().getBytes();
		InputStream is = new ByteArrayInputStream(bytes);
		return is;
	}

	/**
	 * 
	 * load bulk data from InputStream to MySQL
	 */
	public int bulkLoadFromInputStream(String loadDataSql,
			InputStream dataStream) throws SQLException {
		if(dataStream==null){
			logger.info("InputStream is null ,No data is imported");
			return 0;
		}
		conn = jdbcTemplate.getDataSource().getConnection();
		PreparedStatement statement = conn.prepareStatement(loadDataSql);

		int result = 0;

		if (statement.isWrapperFor(com.mysql.jdbc.Statement.class)) {

			com.mysql.jdbc.PreparedStatement mysqlStatement = statement
					.unwrap(com.mysql.jdbc.PreparedStatement.class);

			mysqlStatement.setLocalInfileInputStream(dataStream);
			result = mysqlStatement.executeUpdate();
		}
		return result;
	}

	public static void main(String[] args) {
		String testSql = "LOAD DATA LOCAL INFILE 'sql.csv' IGNORE INTO TABLE test.test (a,b,c,d,e,f)";
		InputStream dataStream = getTestDataInputStream();
		BulkLoadData2MySQL dao = new BulkLoadData2MySQL();
		try {
			long beginTime=System.currentTimeMillis();
			int rows=dao.bulkLoadFromInputStream(testSql, dataStream);
			long endTime=System.currentTimeMillis();
			logger.info("importing "+rows+" rows data into mysql and cost "+(endTime-beginTime)+" ms!");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		System.exit(1);
	}

}

 提示:

 String testSql ="LOAD DATA LOCAL INFILE 'sql.csv' IGNORE INTO TABLE test.test (a,b,c,d,e,f)";
 使用setLocalInfileInputStream方法,会直接忽略掉文件名称,而直接将IO流导入到数据库中。
 
参考:
http://assets.en.oreilly.com/1/event/21/Connector_J%20Performance%20Gems%20Presentation.pdf
http://jeffrick.com/2010/03/23/bulk-insert-into-a-mysql-database/

分享到:
评论

相关推荐

    Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQL

    "Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQL" Java大批量导入MySQL是一种高效的数据导入方式,使用MYSQL的LOAD DATA LOCAL INFILE语句可以快速地从一个文本文件中读取行,并装入一个表中。...

    mysql load data infile 的用法.docx

    * LOCAL:该参数指定是否使用本地文件导入数据,默认情况下,Mysql 不允许使用本地文件导入数据,需要添加该参数来启用该功能。 * IGNORE:该参数指定是否忽略重复的数据,如果数据已经存在于数据库中,将忽略该数据...

    TXT文件数据导入到mysql数据库

    总之,从TXT文件导入数据到MySQL数据库是数据处理中的常见任务,通过选择合适的方法和工具,我们可以有效地完成数据迁移,为后续的数据分析和应用奠定基础。在进行这个过程时,理解TXT文件的格式,熟悉MySQL的数据...

    loadData批量导入以及压缩协议使用指南1

    MySQL的`LOAD DATA INFILE`语句是一种高效的数据批量导入方法,它的性能通常是单条`INSERT`语句的几十倍,特别适用于大数据量的导入。从Mycat 1.4版本开始,它开始支持MySQL的压缩协议,这对于处理大量数据和大结果...

    mysql中的Load data的使用方法

    测试把txt文件导入至mysql数据库中: table: txt文件:D:/data.txt (txt文件下载) ... 您可能感兴趣的文章:Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQLMySQL中由load data语

    DataLoad导入数据快速入门[整理].pdf

    "DataLoad导入数据快速入门" DataLoad是Oracle E-Business Suite(EBS)中的一个数据导入工具,用于将外部数据快速导入到EBS系统中。在本文档中,我们将对DataLoad的基本概念、实现方法和操作步骤进行详细的介绍。 ...

    MySQL中由load data语句引起死锁的解决案例

    一个线上项目报的死锁,简要说明一下产生原因、处理方案和相关的一些点. 1、背景 ...Load data infile ‘data1.csv' into table tb; Load data infile ‘data2.csv' into table tb; cat Data1.csv

    MsSql数据导入MySql

    在描述中提到的`LOAD DATA LOCAL INFILE`是MySQL提供的一种功能,用于快速地从本地文件批量导入数据到表中。这个命令可以极大地提高数据导入的效率,相比逐条INSERT语句执行,它能显著减少导入时间。使用此命令的...

    MySQL里load data遇到的问题及解决方法

    MySQL 是一个关系数据库管理系统,load data 是 MySQL 中的一种数据导入方法,它可以将文本文件中的数据导入到 MySQL 数据库中。但是,在使用 load data 时,可能会遇到一些问题,本文将讨论这些问题和解决方法。 ...

    MySQL数据导入导出

    与 SELECT INTO OUTFILE 相反,LOAD DATA INFILE 不能导入表结构,仅限于导入数据。此外,它也只能一次处理一个表,并且需要手动指定字段分隔符、行分隔符等参数,以确保数据导入的准确性和完整性。 在实际应用中,...

    MySQL中使用load data命令实现数据导入的方法

    代码如下:mysql&gt;load data local infile “D:/ab.txt” into table mytbl(name,age); 使用上述的命令就可以将D:/ab.txt文件的内容导入到表mytbl中,其中name和age是表mytbl的字段,对应ab.txt文件中每行的数据。...

    mysql遇到load data导入文件数据出现1290错误的解决方案

    在MySQL数据库中,`LOAD DATA INFILE` 是一个非常实用的命令,用于快速地将大量数据从文本文件导入到表中。在本文中,我们将深入探讨一个特定的问题,即当尝试使用`LOAD DATA INFILE` 导入数据时遇到错误1290,并...

    JAVA跨数据库导出导入数据:SQL2000 导入到 MYSQL(附件)

    6. **数据导入**:使用`LOAD DATA INFILE`命令或者Java的`PreparedStatement`,将转换后的数据导入到MySQL。如果数据量大,可能需要分批导入以提高效率。 7. **错误处理和验证**:在导入过程中记录错误,确保所有...

    mysql导入文本或excel文件

    `LOAD DATA INFILE`是MySQL提供的一种非常方便的数据导入方式,它允许用户直接从本地文件系统中加载数据到指定的表中。其基本语法如下: ```sql LOAD DATA [LOCAL] INFILE 'file_name' INTO TABLE tbl_name ...

    Mysql漏洞利用(越权,实战怎么从低权限拿到root密码)

    描述:本文介绍了一种Mysql漏洞利用技术,通过 LOAD DATA LOCAL INFILE 语句读取服务器上的文件,并最终拿到root密码。 标签:Mysql 在Mysql中,通常情况下,用户在没有File权限的情况下无法通过 Load_file 读文件...

    将数据导入到mysql数据库中

    3. **导入数据文件** - 进入MySQL的安装目录下的`data`目录。 - 使用命令行工具将`temp`目录中的文件复制到当前目录。 - 确保每个表的`.frm`、`.myd`和`.myi`文件都在同一个位置。 4. **创建数据库** - 打开...

    mysql导入txt文本

    总的来说,MySQL的`LOAD DATA INFILE`功能是一个强大的工具,能够有效地将TXT文本数据导入到数据库中。通过理解其工作原理和参数设置,你可以根据自己的需求进行定制,实现高效的数据迁移。在实际操作中,记得始终...

Global site tag (gtag.js) - Google Analytics