[英]JDBC: CSV raw data export/import from/to remote MySQL database using streams (SELECT INTO OUTFILE / LOAD DATA INFILE)
我正在开发的Web应用程序支持CSV导出(使用SELECT INTO OUTFILE)并导入(使用LOAD DATA INFILE)MySQL服务器来维护庞大的数据集,这些数据集使用Java代码中的SELECT和批量INSERT语句进行处理非常昂贵(处理结果集,字符串编码,业务逻辑遗产等)。 这些CSV文件不是应用程序驱动的,因此它们只代表MySQL数据库中的原始表内容 。 但据我所知,这种方法只有在我有本地文件时才有用,所以web应用服务器和mysqld都必须在同一台机器上运行。
应用程序配置可以指定远程数据库连接。 这显然意味着上传的CSV文件存储在运行Web应用程序的机器本地的某处,因此我无法在MySQL LOAD DATA INFILE语句中指定数据文件位置。 (相同的方案是CSV下载请求)。 所以,我想要找到的是一种“虚拟”指定CSV文件的方法 - 使用可由JDBC和MySQL处理的I / O流,类似于blob管理等。
JDBC / MySQL是否支持这种用于导入和导出的CSV文件的技术?
提前致谢。
您可以使用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) " +
"");
}
有关更多信息,请参阅此帖子 。
不幸的是,看起来你不能使用SELECT INTO OUTFILE从数据库服务器以外的任何地方导出文件,从Stack Overflow上的这个答案 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.