JDBC:使用流从远程 MySQL 数据库导出/导入 CSV 原始数据(SELECT INTO OUTFILE / LOAD DATA INFILE)

Posted

技术标签:

【中文标题】JDBC:使用流从远程 MySQL 数据库导出/导入 CSV 原始数据(SELECT INTO OUTFILE / LOAD DATA INFILE)【英文标题】:JDBC: CSV raw data export/import from/to remote MySQL database using streams (SELECT INTO OUTFILE / LOAD DATA INFILE) 【发布时间】:2012-02-15 06:08:21 【问题描述】:

我目前正在开发的 Web 应用程序支持从(使用 SELECT INTO OUTFILE)导出 CSV 并导入到(使用 LOAD DATA INFILE)mysql 服务器,以维护使用 SELECT 和批量 INSERT 语句处理非常昂贵的庞大数据集在 Java 代码中(处理结果集、字符串编码、业务逻辑继承等)。这些 CSV 文件不是应用程序驱动的,因此它们仅代表 MySQL 数据库中的原始表内容。但据我了解,这种方法只有在我有本地文件时才有效,因此 Web 应用程序服务器和 mysqld 必须在同一台机器上运行。

应用程序配置可以指定远程数据库连接。这显然意味着上传的 CSV 文件存储在本地运行 Web 应用程序的机器上,因此我无法在 MySQL LOAD DATA INFILE 语句中指定数据文件的位置。 (同样的场景适用于 CSV 下载请求)。因此,我试图找到一种“虚拟”指定 CSV 文件的方法 - 使用可由 JDBC 和 MySQL 处理的 I/O 流,类似于 blob 管理等。

JDBC/MySQL 是否支持这种用于导入和导出 CSV 文件的技术?

提前致谢。

【问题讨论】:

【参考方案1】:

您可以使用 LOCAL 选项运行 LOAD DATA INFILE,然后使用 com.mysql.jdbc.Statement#setLocalInfileInputStream 从运行 MySQL JDBC 客户端的位置加载 CSV 文件。例如:

// conn is an existing java.sql.Connection to a remote server
try (Statement st = conn.createStatement()) 
    String localCsvFileSpec = "C:/Users/Jamie/Desktop/foo.csv";  // on this machine
    ((com.mysql.jdbc.Statement) st).setLocalInfileInputStream(
            new FileInputStream(localCsvFileSpec));
    st.execute(
            "LOAD DATA LOCAL INFILE '(placeholder)' " + 
            "INTO TABLE table01 " +
            "COLUMNS TERMINATED BY ',' " +
            "(id, txt) " + 
            "");

更多信息请参见this post。

不幸的是,您似乎无法使用 SELECT INTO OUTFILE 从this answer on Stack Overflow 以外的任何位置导出文件。

【讨论】:

以上是关于JDBC:使用流从远程 MySQL 数据库导出/导入 CSV 原始数据(SELECT INTO OUTFILE / LOAD DATA INFILE)的主要内容,如果未能解决你的问题,请参考以下文章

oracle 表数据 怎么远程导到另一个机器的数据库里

oracle远程导出/导入

mysql 每个表只导出1000条数据

关于使用sqoop export 导出hdfs数据到mysql中文乱码问题

python从mysql导出数据导excel

使用 JDBC 访问远程 MySQL 数据库时出现 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException