2013-01-23 46 views
0

我寫了一個Java程序做我的設計下,想意見:從CSV文件這個數據庫轉儲設計好嗎?

  1. 讀取數據。該文件是具有6列的數據庫轉儲。
  2. 將數據寫入MySQL數據庫表。

數據庫表如下:

CREATE TABLE MYTABLE 
    (
    ID int PRIMARY KEY not null auto_increment, 
    ARTICLEID int, 
    ATTRIBUTE varchar(20), 
    VALUE text, 
    LANGUAGE smallint, 
    TYPE smallint 
    ); 
  1. 我創建的對象來存儲每一行​​。
  2. 我使用OpenCSV將每行讀入1中創建的對象列表中。
  3. 迭代此對象列表並使用PreparedStatements將每行寫入數據庫。

該解決方案應該非常適合需求的變化,並展現出良好的方法,魯棒性和代碼質量。

那個設計看起來好嗎?

我試過的另一種方法是使用'LOAD DATA LOCAL INFILE'sql語句。這會是一個更好的選擇嗎?

編輯:我現在使用OpenCSV,它處理實際字段內有逗號的問題。現在的問題是沒有寫入數據庫。誰能告訴我爲什麼?

public static void exportDataToDb(List<Object> data) { 
    Connection conn = connect("jdbc:mysql://localhost:3306/datadb","myuser","password"); 

    try{ 
     PreparedStatement preparedStatement = null; 
     String query = "INSERT into mytable (ID, X, Y, Z) VALUES(?,?,?,?);"; 
     preparedStatement = conn.prepareStatement(query); 

     for(Object o : data){ 
      preparedStatement.setString(1, o.getId()); 
      preparedStatement.setString(2, o.getX()); 
      preparedStatement.setString(3, o.getY()); 
      preparedStatement.setString(4, o.getZ()); 
     } 
     preparedStatement.executeBatch(); 

    }catch (SQLException s){ 
     System.out.println("SQL statement is not executed!"); 
    } 
} 
+2

再次重新磨輪。 MySQL可以直接導入CSV數據:http://stackoverflow.com/questions/3025648/import-csv-to-mysql我不明白爲什麼要設置一行Java代碼來將CSV導入到數據庫中... – feeela

+0

@feeela此任務適用於工作申請。你認爲你的建議阻止了我展示自己的編碼技能,還是顯示我知道外部工具? – TheCoder

+0

什麼是您的源文件的(近似)預期大小? – RandomSeed

回答

1

從純算法的角度來看,除非你的源CSV文件很小,這將是更好的

  1. 準備插入語句
  2. 啓動事務
  3. 加載一個(或幾行)
  4. 將小批量插入到您的數據庫中
  5. 返回3.雖然有一些li網元remainig
  6. 提交

這樣,就避免了在內存中加載整個轉儲。

但基本上,你可能最好使用LOAD DATA

+0

我正在下載LOAD DATA路線。我現在的問題是,該應用程序在表中插入額外的行;行不在CSV文件中。任何想法爲什麼發生這種情況?我懷疑這是與ID字段的自動增量有關。 – TheCoder

+0

@ user999353如果不需要的行是空的,則可能在行尾有問題(要使用LINES TERMINATED BY子句定義)。請注意,EOL是依賴於系統的。 – RandomSeed

+0

你是對的。我的行結束符是一個逗號,其中一列是一個逗號的句子。任何建議如何繞過這個? – TheCoder

0

如果沒有。的行是巨大的,那麼代碼將在第2步失敗,出現內存不足錯誤。您需要找出一種方法來獲取區塊中的行,併爲該區塊執行批處理和準備好的語句,繼續處理所有行。這將適用於任何沒有。的行以及配料也會提高性能。除此之外,我沒有看到任何設計問題。

+0

您是否同意LOAD DATA是儘可能最好的方法? – TheCoder