0

私は、次のことを行う 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 を使用しており、実際のフィールド内にコンマがあるという問題を処理しています。現在の問題は、DB に何も書き込まれていないことです。誰でも理由を教えてもらえますか?

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!");
    }
}
4

2 に答える 2

1

純粋にアルゴリズムの観点から、そしてソースCSVファイルが小さい場合を除いて、

  1. 挿入ステートメントを準備します
  2. トランザクションを開始します
  3. そこから1つ(または数)行をロードします
  4. 小さなバッチをデータベースに挿入します
  5. いくつかの行が残っている間、3に戻ります。
  6. 専念

このようにして、ダンプ全体をメモリにロードすることを回避します。

しかし、基本的には、おそらく使用したほうがよいでしょうLOAD DATA

于 2013-01-23T08:50:54.010 に答える
0

いいえ。行数が膨大な場合、コードは手順 2 でメモリ不足エラーで失敗します。行をチャンクで取得し、そのチャンクに対して準備済みステートメントを使用してバッチを実行する方法を見つけ、すべての行が処理されるまで続行する必要があります。これは、任意の番号で機能します。行の数とバッチ処理によってパフォーマンスが向上します。それ以外はデザインに問題はないと思います。

于 2013-01-23T09:02:45.193 に答える