5

您好我想通过 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 驱动程序支持此命令?如果不是什么应该是解决这个问题的最有效的快速方法。

请指导。提前致谢。

4

4 回答 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的文件位置是基于服务器的文件系统的!如果您使用本地文件,那么显然它是基于客户端的文件系统的。

于 2013-06-26T08:16:27.440 回答
4

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

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

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

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

于 2013-06-26T07:28:44.373 回答
1

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

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

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

于 2013-06-26T07:26:43.610 回答
1

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

当使用“ load data infile ”或“ load data local infile ”时,插入的记录不会被添加到bin log,这意味着如果你使用replication,“load data infile”插入的记录不会被传输到slave服务器,插入的记录不会有任何交易记录,这就是为什么加载数据文件比标准插入要快得多,并且由于没有对插入的数据进行验证。

于 2014-10-29T17:19:04.677 回答