大家都知道当插入大批量数据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是一种高效的数据导入方式,使用MYSQL的LOAD DATA LOCAL INFILE语句可以快速地从一个文本文件中读取行,并装入一个表中。...
* LOCAL:该参数指定是否使用本地文件导入数据,默认情况下,Mysql 不允许使用本地文件导入数据,需要添加该参数来启用该功能。 * IGNORE:该参数指定是否忽略重复的数据,如果数据已经存在于数据库中,将忽略该数据...
总之,从TXT文件导入数据到MySQL数据库是数据处理中的常见任务,通过选择合适的方法和工具,我们可以有效地完成数据迁移,为后续的数据分析和应用奠定基础。在进行这个过程时,理解TXT文件的格式,熟悉MySQL的数据...
MySQL的`LOAD DATA INFILE`语句是一种高效的数据批量导入方法,它的性能通常是单条`INSERT`语句的几十倍,特别适用于大数据量的导入。从Mycat 1.4版本开始,它开始支持MySQL的压缩协议,这对于处理大量数据和大结果...
测试把txt文件导入至mysql数据库中: table: txt文件:D:/data.txt (txt文件下载) ... 您可能感兴趣的文章:Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQLMySQL中由load data语
"DataLoad导入数据快速入门" DataLoad是Oracle E-Business Suite(EBS)中的一个数据导入工具,用于将外部数据快速导入到EBS系统中。在本文档中,我们将对DataLoad的基本概念、实现方法和操作步骤进行详细的介绍。 ...
一个线上项目报的死锁,简要说明一下产生原因、处理方案和相关的一些点. 1、背景 ...Load data infile ‘data1.csv' into table tb; Load data infile ‘data2.csv' into table tb; cat Data1.csv
在描述中提到的`LOAD DATA LOCAL INFILE`是MySQL提供的一种功能,用于快速地从本地文件批量导入数据到表中。这个命令可以极大地提高数据导入的效率,相比逐条INSERT语句执行,它能显著减少导入时间。使用此命令的...
MySQL 是一个关系数据库管理系统,load data 是 MySQL 中的一种数据导入方法,它可以将文本文件中的数据导入到 MySQL 数据库中。但是,在使用 load data 时,可能会遇到一些问题,本文将讨论这些问题和解决方法。 ...
与 SELECT INTO OUTFILE 相反,LOAD DATA INFILE 不能导入表结构,仅限于导入数据。此外,它也只能一次处理一个表,并且需要手动指定字段分隔符、行分隔符等参数,以确保数据导入的准确性和完整性。 在实际应用中,...
代码如下:mysql>load data local infile “D:/ab.txt” into table mytbl(name,age); 使用上述的命令就可以将D:/ab.txt文件的内容导入到表mytbl中,其中name和age是表mytbl的字段,对应ab.txt文件中每行的数据。...
在MySQL数据库中,`LOAD DATA INFILE` 是一个非常实用的命令,用于快速地将大量数据从文本文件导入到表中。在本文中,我们将深入探讨一个特定的问题,即当尝试使用`LOAD DATA INFILE` 导入数据时遇到错误1290,并...
6. **数据导入**:使用`LOAD DATA INFILE`命令或者Java的`PreparedStatement`,将转换后的数据导入到MySQL。如果数据量大,可能需要分批导入以提高效率。 7. **错误处理和验证**:在导入过程中记录错误,确保所有...
`LOAD DATA INFILE`是MySQL提供的一种非常方便的数据导入方式,它允许用户直接从本地文件系统中加载数据到指定的表中。其基本语法如下: ```sql LOAD DATA [LOCAL] INFILE 'file_name' INTO TABLE tbl_name ...
描述:本文介绍了一种Mysql漏洞利用技术,通过 LOAD DATA LOCAL INFILE 语句读取服务器上的文件,并最终拿到root密码。 标签:Mysql 在Mysql中,通常情况下,用户在没有File权限的情况下无法通过 Load_file 读文件...
3. **导入数据文件** - 进入MySQL的安装目录下的`data`目录。 - 使用命令行工具将`temp`目录中的文件复制到当前目录。 - 确保每个表的`.frm`、`.myd`和`.myi`文件都在同一个位置。 4. **创建数据库** - 打开...
总的来说,MySQL的`LOAD DATA INFILE`功能是一个强大的工具,能够有效地将TXT文本数据导入到数据库中。通过理解其工作原理和参数设置,你可以根据自己的需求进行定制,实现高效的数据迁移。在实际操作中,记得始终...