簡體   English   中英

這種數據庫轉儲設計可以嗎?

[英]Is this database dump design ok?

我已經編寫了一個Java程序來執行以下操作,並希望對我的設計發表意見:

  1. 從CSV文件讀取數據。 該文件是具有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!");
    }
}

從純算法的角度來看,除非源CSV文件很小,否則最好這樣做

  1. 准備您的插入語句
  2. 開始交易
  3. 從其中加載一(或幾)行
  4. 將小批量插入數據庫
  5. 返回3。
  6. 承諾

這樣,您可以避免將整個轉儲加載到內存中。

但基本上,您最好使用LOAD DATA

如果沒有。 行數很大,則代碼將在步驟2中失敗,並顯示內存不足錯誤。 您需要找出一種方法來獲取大塊中的行,並使用該塊的准備好的語句執行批處理,然后繼續直到處理完所有行。 這將適用於任何否。 行和批處理將提高性能。 除此之外,我認為設計沒有任何問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM