1

データベースから取得するフォーマット情報と値を含むxmlを読み取って、ファイルを作成する必要があります。私は多数のレコード(200,000)に取り組んでいます。すべてのデータをメモリに保持しようとしましたが、メモリ不足エラーが発生しました。データベースに何度もアクセスしようとしましたが、パフォーマンスの問題が発生しました。クエリが何度もヒットすると、パフォーマンスが低下します。

プロセスに必要な手順:

  1. db を押して、ファイルが作成されるすべてのレコードを取得します
  2. Jaxbを使用してxmlファイルを読み取る
  3. ステップ 1 で取得したすべてのデータのマップを作成します。
  4. step1から取得したマップを反復する
  5. 手順 2 で作成したフォーマット オブジェクトから表示する必要があるデータを取得する
  6. 結果を各レコードの文字列に追加し、それをファイルに書き込む

ただし、最終的には、事前定義された数のデータを1回読み取り、これに対してファイルを書き込んでから、次の束に取り組むことでこれを解決しました。しかし、私はこのための設計パターンに従っていません。

最小限のメモリを使用し、効率的にファイルを書き込める設計パターンはありますか?

4

2 に答える 2

0

XML に書き込んでいる場合は、読み込むたびに各レコードを書き出すことをお勧めします。この方法では、一度に 1 つのレコードに十分なメモリしか必要なく、レコードの数に関係ありません。

例えば

Statement stmt = null;
String query =
    "select COF_NAME, SUP_ID, PRICE, " +
    "SALES, TOTAL " +
    "from " + dbName + ".COFFEES";

try {
    stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(query);
    while (rs.next()) {
        xmlFile.println("<coffee>\n" +
              "<coffeename>" + rs.getString("COF_NAME") + "</coffeename>\n" +
              "<supId>" + rs.getInt("SUP_ID")+ "</supId>\n" + 
              "<price>" + rs.getFloat("PRICE") + "</price>\n" + 
              "<sales>" + rs.getInt("SALES") + "</sales>\n" + 
              "<total>" + rs.getInt("TOTAL") + "</total>\n" +
              "</coffee>");
    }
} catch (SQLException e ) {
    JDBCTutorialUtilities.printSQLException(e);
} finally {
    if (stmt != null) { stmt.close(); }
}

特殊文字が含まれている場合は、文字列をエスケープする必要がある場合があります。

于 2015-01-20T19:43:00.723 に答える