0

ファイルから約1,000000行のデータを読み取り、Javaを使用してデータベースにデータをアップロードする必要があります。以下は、要件の詳細と、私がすでに作成したソリューションの一部です。

  1. ファイル(任意の形式のXML、フラットファイル、CSV)からデータを読み取ります。ファイル形式に応じて、クラスを初期化します(ファクトリパターンを使用)。テキストファイルの場合、BufferedReaderを使用してから、作成された各オブジェクト(employeeなど)をリストに追加します。同様に、XMLの場合、SAXParserを使用しており、1つのオブジェクトからデータを読み取った後、上記と同じようにリストに追加されます。

  2. しかし、保存できないか、リストに1000000個のオブジェクトを保存する必要があると思います。したがって、ファイルが読み取られ、リストが特定のサイズに達したときに、データをデータベースに並列にフラッシュする必要があります。これは私が立ち往生しているところです。これはどのように処理する必要がありますか?リストサイズがたとえば1000に達すると、データベース内のデータを更新する並列スレッドを実行する必要があります。その間、ファイルを読み取るスレッドは待機する必要がありますか?DBは、任意のデータベースOracle/MSアクセスにすることができます。

以下は、テキストファイルを読み取っているコードです。

public class FlatFileLoader implements Loader {

@Override
public List<Employee> readData(String path) {

    try {
        List<Employee> personList =  new ArrayList<Person>();
        FileReader fr = new FileReader(path);
        BufferedReader br = new BufferedReader(fr);
          String line=null;

          while ((line = br.readLine()) != null) {
              Employee person = scanLine(line, DataConstants.DELIMITER);
              if(null != person)
              personList.add(person);

            }
          br.close();

        }
        catch (IOException e) {
          System.err.println(e);
        }
    return null;
}

private Employee scanLine(String recordLine, String delim) {
    Employee person=null;
    List data= new ArrayList();
    StringTokenizer lineScanner = new StringTokenizer(recordLine, delim);
    while (lineScanner.hasMoreElements()) {
        String nextEle= (String) lineScanner.nextElement();
        if(nextEle.equalsIgnoreCase("FIRST_NAME")){
            break;
        }
        data.add(nextEle);

    }
    if(data.size() > 0){
        DataUtil.populatedata(data);
    }
    return person;
}

}

メソッド はオブジェクトDataUtil.populatedata(data) を作成しEmployeeます。では、DBのデータを更新するための呼び出しをどこに置くべきですか?上記のコードを改善するための提案も歓迎します。

4

1 に答える 1

0

データをフラッシュする方法は、基本的に使用するメモリの量によって異なりますが、ロードされたEmployeeのインスタンスごとにDBに書き込む必要がないため、1000個程度のオブジェクトをロードした後にデータをフラッシュすることをお勧めします。オブジェクトは多くのメモリを消費します。

並列スレッドを使用して従業員オブジェクトのリストをフラッシュしている場合は、スレッド同期の問題に注意してください。次の1000オブジェクトを挿入するスレッドt2を作成する前に、スレッドt1が1000オブジェクトのdbへの挿入を完了しない場合があります。したがって、2つのスレッドがDBにオブジェクトを並行して挿入しているため、入力ファイル(XML、テキスト)内のデータの順序がDBに保持されない可能性があります。

私の提案:それをシンプルに保ち、データがDBに挿入されるまでリーダーを待たせます。1000000オブジェクトはとにかくそれほど多くはありません...

personList.add(person)の後にDB挿入コードを挿入します。

....
    if(personList.size()>=1000){
        flushToDB(personList);
        personList.clear();
    }
....

その間、

void flushtoDB(List<Employee> persons){
    for(Employee person:persons){
        //insert Employee object into DB
    }
}
于 2012-09-02T08:32:01.963 に答える