任何JDBC驱动程序是否支持LOAD DATA INFILE SQL命令?

5

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

CustName OrderNo PhoneNo

XYZ      230     123456789
ABC      450     879641238    

现在,data.txt包含数千个以空格分隔的值。我需要使用Java IO逐行解析此文件,并为每个记录执行SQL插入查询。

我发现有LOAD DATA INFILE SQL命令。是否有任何JDBC驱动程序支持此命令?如果没有,应该采用最佳有效快速的方法来解决此问题。

请指导。提前致谢。


1
你可以通过JDBC使用load data infile(文件必须位于服务器上!)- 为什么不试一下呢? - user330315
1
@a_horse_with_no_name 非常感谢您的回答。我了解到JDBC驱动程序不支持LOAD DATA INFILE命令,所以我才提出这个问题。 - Umesh K
你在哪里看到的?当你尝试时发生了什么? - user330315
嗨@Umesh-我希望你没有从我的下面的答案中得出那个结论。我只是“猜测”JDBC驱动程序不支持它。 - DaveH
1
@DaveHowes 我并不是从你的答案中得出的结论,我在很多地方也看到了同样的信息,所以我在这里问了一个问题,即JDBC驱动程序是否支持LOAD DATA INFILE。 - Umesh K
相信我,它确实可以工作。请查看我的答案以获取一个快速(而且有点粗糙)的测试程序。 - user330315
4个回答

8
以下内容将通过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上运行,不过我怀疑它是否能够在这些数据库上运行。既然您是数据库专家,请指导一下。 - Umesh K
1
“LOAD DATA”是MySQL特有的功能,其他数据库管理系统上不可用。如果您想要跨平台执行此操作,您将需要自己解析文件并为每一行生成“普通”的INSERT语句。 - user330315
我也是这么想的,无论如何我都需要解析文件,非常感谢你的指导。 - Umesh K

4
我认为LOAD DATA INFILE是特定于MySQL的,怀疑JDBC驱动程序是否支持它。其他数据库将拥有类似但不同的实用工具。
如果你想以数据库无关的方式进行操作,我认为你有两个选择:
1.解析输入文件并在JDBC连接上使用SQL INSERT语句。 2.编写多个不同的、特定于数据库的脚本,确定你正在使用哪个DBMS,并使用Runtime.exec执行正确的脚本。
除非你有令人信服的性能原因,否则我会选择选项1。

1
好的,谢谢你澄清了这一点。但我猜这是针对mySql特定的,对吗?原帖的作者需要的是能够跨多个数据库工作的东西,所以除非所有供应商的数据加载工具都可以通过他们的JDBC驱动程序工作,否则他仍然会遇到麻烦。 - DaveH
是的,它是MySQL特定的。一些DBMS通过SQL语句支持此功能(例如Postgres的COPY),而有些则没有用于批量加载的SQL语句,只能使用外部命令行程序。 - user330315

1
"Load data local infile"可与MySQL的JDBC驱动程序一起使用,但存在一些问题。
在使用“load data infile”或“load data local infile”时,插入的记录不会添加到二进制日志中。这意味着如果您正在使用复制,通过“load data infile”插入的记录将不会传输到从服务器,插入的记录将没有任何交易记录,这就是为什么load data infile比标准插入快得多,并且由于插入的数据没有经过验证。

这不是真的;通过LOAD DATA INFILE加载的数据是被复制的。我有7年在生产环境中使用该特性并具有存在证明 :) 数据本身确实没有很好地经过验证(例如,无效日期->臭名昭著的0000-00-00),但插入本身发生在连接启动的任何事务的上下文中。 - Barry Kelly

1
我相信使用LOAD DATA INFILE比使用Java解析文件并插入记录更快。您可以通过JDBC执行load data infile查询。根据Oracle docMySql doc的说明:

LOAD DATA INFILE语句可以以非常高的速度从文本文件中读取行,并将它们存储到表中。

文件应该在服务器上。您可以尝试这两种方法,记录它们消耗的时间。

非常感谢您的输入。我怀疑 JDBC 驱动程序不支持 LOAD DATA INFILE SQL 命令。这就是为什么我问这个问题的原因。请指导一下。 - Umesh K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接