`
275012124
  • 浏览: 36903 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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如下:
[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 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