1

問題

XMLのような(フィルタリングする必要がある非Unicodeを持っている)データがあります。

<row><div>1234</div><dept>ABCD</dept></row>
<row><div>5678</div><dept>EFGH</dept></row>

理解しやすいように、2 つの列のタグだけに言及します。実際には、それぞれに20を超える列タグがあります

XML データは、次のように Oracle スキーマ テーブルにレコードとして直接挿入されます。

div_c  qdept
1234   ABCD
5678   EFGH

詳しくは

  1. XML ファイルは 9 ギガ以上で、FTP で利用できます。
  2. データベース テーブルの列名は、XML 列のタグ名とは異なる場合があります。
  3. 行を除外するには、いくつかのルールを追加/定義する必要がある場合があります。

質問

この膨大な XML を解析し、そのレコードがデータベース テーブルに存在するかどうかを確認するには、どのような方法が適切でしょうか? 利用できるオープンソース ツールはありますか?

試していること

  • 無効な文字フィルター (FilterReader) を備えたデフォルトの実装 (XMLInputFactory) を使用して StAX パーサーを作成しました。
  • XML をチャンクとして分割する計画
  • 各チャンクを並行スレッドで処理する
  • 各スレッドは、それがデータベースに存在するかどうかを確認するクエリを生成します (私はそのばかげたことを知っています)
  • 接続プールを作成し、各スレッドでそれらのクエリを実行します

これは私がやっていることが本当に最悪であり、完了するまでに何年もかかることを私は知っています。チェックを簡単にし、XML 解析を高速にするために ORM を使用するかどうかなど、これに関するアドバイスが本当に必要です。

そのようないくつかの提案は本当に私を助けます.

4

1 に答える 1

1

Yeah. I think you were right to use StAX. You definitely want to stream and StAX seems to have the simplest API for streaming XML. I wouldn't go to ORM right away. Most ORM is to round-trip data. It saves you work for mechanical transformations. That makes it good when you have very structured data but the mapping between the two schemas is not very complicated. Here you are trying import data from one format into another. It sounds like your large dataset has a fairly simple schema but the mapping is the more complicated part. Go with custom code. Pawel's suggestion of the temporary table sounds good. Try to do as much processing as you can in stored procedures that operate on the whole dataset at once (old and imported). You don't want to keep transferring those rows back and forth from the database to your app.

于 2012-06-02T03:08:34.317 に答える