大家都知道当插入大批量数据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如下:
[sql] view plaincopy
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代码如下:
[java] view plaincopy
package com.seven.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;
/**
* @author seven
* @since 07.03.2013
*/
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://blog.csdn.net/seven_3306/article/details/9237495
分享到:
相关推荐
"Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQL" Java大批量导入MySQL是一种高效的数据导入方式,使用MYSQL的LOAD DATA LOCAL INFILE语句可以快速地从一个文本文件中读取行,并装入一个表中。...
测试把txt文件导入至mysql数据库中: table: txt文件:D:/data.txt (txt文件下载) ... 您可能感兴趣的文章:Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQLMySQL中由load data语
总之,`LOAD DATA INFILE`是MySQL中进行大批量数据导入的高效工具,对于需要快速处理大量数据的场景,它提供了显著优于`INSERT`的性能。在实际应用中,根据数据格式和需求,合理利用这些特性,可以极大地提升数据...
使用`LOAD DATA INFILE`语句将TXT文件中的数据导入到MySQL表中。 ```sql LOAD DATA LOCAL INFILE 'D:\\cccccc.txt' INTO TABLE book FIELDS TERMINATED BY '\t'; ``` 如果只想导入Excel中的某几列,可以在`INTO ...
首先,MySQL提供了一个名为`LOAD DATA INFILE`的SQL语句,用于快速、大批量地加载数据。这个语句可以从文本文件中导入数据到现有的表中。例如,如果你有一个名为`dump.txt`的文件,其中包含了数据,你可以使用以下...
`LOCAL_INFILE`特性允许从本地文件导入数据,通常配合`LOAD DATA INFILE`语句使用,效率非常高,适用于大量数据的快速导入。首先,需要确保MySQL配置文件中`local_infile`选项已启用,然后在PHP中设置`PDO`连接的`...
- 使用`LOAD DATA LOCAL INFILE`命令从本地文件加载数据到MySQL表中时,应确保文件格式与表结构匹配,并且字段分隔符设置正确。 - 考虑使用批量插入方式代替逐行插入,可以显著提高导入速度。 2. **表结构调整**...
- 使用 `LOAD DATA INFILE` 命令高效地导入数据。 ```sql mysql> LOAD DATA INFILE 'data.txt' INTO TABLE db.my_table; ``` - 在导入大量数据到 MyISAM 表时,可以先禁用非唯一索引更新,再导入数据,最后启用...