2013-06-26 30 views
4

您好我想通過JDBC在多個數據庫如DB2,Sybase,MySQL等創建表。現在我需要創建這個表使用文本文件說data.txt其中包含數據空間分隔值。對於例如任何JDBC驅動程序是否支持LOAD DATA INFILE sql命令?

CustName OrderNo PhoneNo 

XYZ  230  123456789 
ABC  450  879641238  

現在這個data.txt包含數千記錄空間分隔值。我需要使用java io逐行解析這個文件,併爲每條記錄執行sql插入查詢。

我發現那裏有LOAD DATA INFILE sql命令。任何JDBC驅動程序是否都支持此命令?如果不是什麼應該是解決這個問題的最有效的快速方法。

請指導。提前致謝。

+1

您可以通過JDBC使用'load data infile'(該文件必須位於服務器上!) - 您爲什麼不簡單地嘗試它? –

+1

@a_horse_with_no_name非常感謝您的參與。我讀過JDBC驅動程序不支持LOAD DATA INFILE命令,所以我問了這個問題? – u449355

+0

你從哪裏讀到的?當你嘗試時發生了什麼? –

回答

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文件的位置是基於服務器的文件系統!如果您使用本地文件,那麼顯然它基於客戶端的文件系統。

+0

非常感謝您的回答。我知道這段代碼適用於MYSQL,但我希望它能在Sybase,Oracle和DB2上運行,我懷疑它會在這些dbs上運行。由於您是數據庫專家,請指導。 – u449355

+1

LOAD DATA是MySQL特有的功能。它不適用於任何其他DBMS。如果你想要一個跨平臺的方式來做到這一點,你將不得不自己解析文件,併爲每一行生成「普通」的INSERT語句。 –

+0

我以爲相同的我將不得不解析文件反正非常感謝指導。 – u449355

1

我相信LOAD DATA INFILE比解析文件和使用Java插入記錄更快。您可以通過JDBC執行對load data infile的查詢。按本Oracle docMySql doc

的LOAD DATA INFILE語句以非常高的速度讀取從文本文件到錶行。

該文件應在服務器中。你可以嘗試兩種方法,記錄每個人消耗的時間。

+0

嗨,非常感謝您的意見。我懷疑JDBC驅動程序不支持LOAD DATA INFILE sql命令。這就是爲什麼我問這個問題。請指導。 – u449355

4

我認爲LOAD DATA INFILE是特定於mySql,我懷疑JDBC驅動程序是否會支持它。其它數據庫將有類似(但不同)公用事業

如果你想這樣做,這是一個獨立於數據庫的方式,我認爲你有兩個選擇

  1. 解析了輸入文件,並使用SQL INSERT語句通過JDBC連接
  2. 寫一些不同的,取決於數據庫的腳本,確定你所使用的DBMS和使用執行一個正確的Runtime.exec

除非有令人信服的表現理由不,我會去的選項1 。

+1

'LOAD DATA'當然可以通過JDBC工作。 –

+1

好的 - 謝謝你清理那個。但我猜這是mySql特定的,但? OP需要能夠跨多個數據庫工作的東西,除非所有供應商的數據載入實用程序都通過JDBC驅動程序工作,否則他仍然會遇到麻煩。 – DaveH

+0

是的,它是MySQL的具體。有些DBMS通過SQL語句支持這種操作(例如Postgres的COPY),有些DBMS沒有用於批量加載的SQL語句,只有外部命令行程序。 –

1

LOAD DATA LOCAL INFILE」 確實與MySQL的JDBC驅動程序,也有一些問題,與此有關。

當使用「LOAD DATA INFILE」或「LOAD DATA LOCAL INFILE」插入記錄將不會被添加到bin日誌,這意味着如果你正在使用複製記錄插入的「負載數據信息「不會被傳送到從屬服務器,插入的記錄將不會有任何交易記錄,這就是爲什麼加載數據信息比標準插入信息快得多以及由於沒有對插入數據進行驗證的原因。