【问题标题】:Does any JDBC driver supports LOAD DATA INFILE sql command?是否有任何 JDBC 驱动程序支持 LOAD DATA INFILE sql 命令?
【发布时间】:2013-06-23 05:30:05
【问题描述】:

您好,我想通过 JDBC 在多个数据库(如 DB2、Sybase、MySQL 等)上创建表。现在我需要使用包含数据空间分隔值的文本文件说 data.txt 创建此表。例如

CustName OrderNo PhoneNo

XYZ      230     123456789
ABC      450     879641238    

现在这个 data.txt 包含数千个记录空间分隔值。我需要使用 java io 逐行解析这个文件,并对每条记录执行 sql insert 查询。

我发现有 LOAD DATA INFILE sql 命令。是否有任何 JDBC 驱动程序支持此命令?如果不是,那么解决这个问题的最有效的快速方法应该是什么。

请指导。提前致谢。

【问题讨论】:

  • 你可以通过JDBC使用load data infile(文件必须在服务器上!)-你为什么不干脆试试呢?
  • @a_horse_with_no_name 非常感谢您的意见。我读到 JDBC 驱动程序不支持 LOAD DATA INFILE 命令所以我问了这个问题?
  • 你在哪里读到的?当你尝试时发生了什么?
  • 嘿@Umesh - 我希望你没有从我下面的回答中理解这一点。我只是猜测 JDBC 驱动程序不支持它。
  • @DaveHowes 我没有从你的答案中得到答案,我在很多地方也读到了同样的内容,所以我在这里问了一个问题,即 JDBC 驱动程序支持 LOAD DATA INFILE

标签: java mysql database jdbc


【解决方案1】:

我相信 LOAD DATA INFILE 比使用 Java 解析文件和插入记录要快。您可以通过 JDBC 对load data infile 执行查询。按照这个Oracle doc和MySql doc:

LOAD DATA INFILE 语句以非常高的速度将文本文件中的行读取到表中。

文件应该在 server 中。您可以尝试这两种方法,记录每种方法消耗的时间。

【讨论】:

  • 您好,非常感谢您的意见。我怀疑那里的 JDBC 驱动程序不支持 LOAD DATA INFILE sql 命令。这就是我问这个问题的原因。请指导。
【解决方案2】:

我认为LOAD DATA INFILE 是mySql 特有的,我怀疑JDBC 驱动程序是否支持它。其他数据库将有类似(但不同)的实用程序

如果你想这样做是一种独立于数据库的方式,我认为你有两个选择

  1. 解析输入文件并通过 JDBC 连接使用 SQL INSERT 语句
  2. 编写多个不同的、依赖于数据库的脚本,确定您正在使用的 dbms 并使用 Runtime.exec 执行正确的一个

除非您有令人信服的性能理由不这样做,否则我会选择选项 1。

【讨论】:

  • 好的 - 感谢您解决这个问题。但我猜它是特定于 mySql 的吗? OP 需要可以跨多个数据库工作的东西,因此,除非所有供应商的数据加载实用程序都通过他们的 JDBC 驱动程序工作,否则他仍然会遇到麻烦。
  • 是的,它是特定于 MySQL 的。一些 DBMS 通过 SQL 语句支持这一点(例如 COPY 用于 Postgres),有些没有用于批量加载的 SQL 语句,只有外部命令行程序。
【解决方案3】:

以下将通过 JDBC 工作。请注意,要使用LOAD DATA INFILE,您需要超级用户权限。你不需要 LOAD DATA LOCAL INFILE

Connection con = DriverManager.getConnection("jdbc:mysql://localhost/foobar", "root", "password");
Statement stmt = con.createStatement();
String sql = 
    "load data infile 'c:/temp/some_data.txt' \n" +
    "   replace \n" +
    "   into table prd \n" +
    "   columns terminated by '\\t' \n" +
    "   ignore 1 lines";
stmt.execute(sql);

如果您使用LOAD DATA INFILE,则文件位置基于服务器的文件系统!如果您使用本地文件,那么显然它是基于客户端的文件系统的。

【讨论】:

  • 非常感谢您的回答。我知道这段代码可以在 MYSQL 上运行,但我希望它可以在 Sybase、Oracle、DB2 上运行,我怀疑它是否会在这些 dbs 上运行。由于您是数据库专家,请指导。
  • LOAD DATA 是 MySQL 特有的功能。它在任何其他 DBMS 上均不可用。如果你想要一种跨平台的方式来做到这一点,你必须自己解析文件并为每一行生成“普通”的 INSERT 语句。
  • 我想我还是要解析文件,非常感谢您的指导。
【解决方案4】:

"Load data local infile" 确实适用于 MySQL 的 JDBC 驱动程序,但存在一些问题。

当使用“load data infile”或“load data local infile”时,插入的记录不会添加到 bin 日志中,这意味着如果您使用复制,“加载数据文件”插入的记录将不会传输到从服务器,插入的记录将没有任何事务记录,这就是加载数据文件的速度如此之快的原因与标准插入相比,并且由于未对插入的数据进行验证。

【讨论】:

  • 这不是真的;通过 LOAD DATA INFILE 加载的数据被复制。我有使用复制功能在生产中运行 7 年的存在证明 :) 数据没有得到很好的验证,当然(例如无效日期 -> 臭名昭著的0000-00-00),但插入本身发生在无论连接已启动什么事务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多