高速MSSQLデータベースからのバッチデータをストリーミング

ディミトリShkoklev:

私は、Hibernateを使用してSQL Serverデータベース内の複雑なクエリから各行を読み込み、結果をファイルに記述する必要があります。次のコードが適切であったと思われたので、しかし、クエリは、数百万レコードを返すことができます。

Session unwrap = entityManager.unwrap(Session.class);
NativeQuery nativeQuery =
    unwrap.createNativeQuery("the sql query string read from a file");
nativeQuery.setFlushMode(FlushMode.MANUAL);
nativeQuery.addEntity("C", CustomObject.class);
nativeQuery.setFetchSize(100000);
nativeQuery.setReadOnly(true);
ScrollableResults scroll = nativeQuery.scroll(ScrollMode.FORWARD_ONLY);

while(scroll.next()) {
   CustomObject customObject = (CustomObject) scroll.get(0);
   jsonGenerator.writeObject(customObject); // using the JsonGenerator library https://fasterxml.github.io/jackson-core/javadoc/2.6/com/fasterxml/jackson/core/JsonGenerator.html
   unwrap.evict(claimEntity);
}

現在、このコードは遅すぎるファイルに約1万レコードを書き込むために約3〜4日かかります。私は休止状態とMSSQL-JDBCドライバを使用していると私はフェッチサイズがドライバによって無視されるかもしれないことを前提としていますが、ドライバを変更すると、一括コピー機能をサポートしていない他のドライバー以来、私のためのオプションではありません。

問題は、Hibernateは、おそらく高価なネットワーク呼び出し、その結果、データベースから個別の行をフェッチするための接続を行うことです。

私は、接続の自動虚偽や他のものへのコミットモードを設定し、カーソルを有効にし、適応バッファリングを設定しようとしたが、何もこれより速く作るように見えません。

私はこれより速くしたいと思いますし、任意の助けをいただければ幸いです。

アーディティヤレワリ:

同様の問題を持っていました!

銀行の移行の作業を関与プロジェクトにしながら、データセットは、あまりにも大きかったです

ソリューションを採用:代わりのJavaバッチのPLSQLを使用します。彼らは常に高速です。


もう一つは、大規模なデータセットのための私の経験の書き込みから、私はこれに追加したいと考えます

  • 代わりに、すべての繰り返しの後にコミットするのではなく、ために行くBULKコミット

私たちは、結果セットを超える3万回の反復の後、一緒にコミットするために使用しました。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=28929&siteId=1