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

时间:2013-06-26 07:22:17

标签: java mysql database jdbc

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

CustName OrderNo PhoneNo

XYZ      230     123456789
ABC      450     879641238    

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

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

请指导。提前谢谢。

4 个答案:

答案 0 :(得分:7)

以下内容将通过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,文件位置基于服务器的文件系统!如果您使用本地文件,那么显然它基于客户端的文件系统。

答案 1 :(得分:4)

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

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

  1. 解析输入文件并通过JDBC连接使用SQL INSERT语句
  2. 编写许多不同的数据库相关脚本,确定您正在使用哪些dbms并使用Runtime.exec执行正确的dbms
  3. 除非你有令人信服的表现理由,否则我会选择第1项。

答案 2 :(得分:1)

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

  

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

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

答案 3 :(得分:1)

加载数据本地infile ”确实可以与MySQL的JDBC驱动程序一起使用,这有一些问题。

当使用“加载数据infile ”或“加载数据本地infile ”时,插入的记录将不会添加到bin日志中,这意味着如果您使用复制,“加载数据infile”插入的记录将不会传输到从属服务器,插入的记录将没有任何事务记录,这就是加载数据infile快得多的原因而不是标准插入,并且由于没有对插入的数据进行验证。