您好我想在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驱动程序支持此命令?如果不是什么应该是解决这个问题的最有效的快速方法。
请指导。提前谢谢。
答案 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项。
答案 2 :(得分:1)
我相信LOAD DATA INFILE
比解析文件和使用Java插入记录更快。您可以通过JDBC执行load data infile
的查询。根据此Oracle doc和MySql doc:
LOAD DATA INFILE语句以非常高的速度将文本文件中的行读取到表中。
该文件应该在服务器中。您可以尝试这两种方法,记录每个方法消耗的时间。
答案 3 :(得分:1)
“ 加载数据本地infile ”确实可以与MySQL的JDBC驱动程序一起使用,这有一些问题。
当使用“加载数据infile ”或“加载数据本地infile ”时,插入的记录将不会添加到bin日志中,这意味着如果您使用复制,“加载数据infile”插入的记录将不会传输到从属服务器,插入的记录将没有任何事务记录,这就是加载数据infile快得多的原因而不是标准插入,并且由于没有对插入的数据进行验证。