2017-10-25 6 views
1

Javaで4Millionsレコードを処理する必要があります。 AS400からOracleにコピーする必要があります。私は何をしているのですか?バッチごとにレコードバッチをコミットしています。バッチサイズはユーザー定義です。そのことを仮定しましょう。ConnectionオブジェクトがJavaでクリアされるときは?

私は接続オブジェクトを作成し、100レコードのバッチを作成してコミットします。 2000をコミットしたら、既存のConnectionオブジェクトを閉じて新しいConnectionオブジェクトを作成します。

だから、私は以下の疑問を持っています。

私はバッチをコミットし、私は100レコードをコミットしたデータはメモリになりますか?接続オブジェクトでは?私はそれを閉じていないので?

  1. 何か新しい接続オブジェクトを作成したら、100レコードをコミットします。この場合、100以上の接続オブジェクトを作成し、適切に閉じてしまいます。パフォーマンスに影響はありますか?
+2

まだ接続が必要な理由を知りません。実際、これらの接続は通常はプールされ、独立した要求の間に保持されます。 – chrylis

答えて

1

JDBC接続の作成は、ほとんどの場合高価です。したがって、通常は接続プールを使用して再利用するための接続を維持するDataSourceの概念が作成されました。ここで

はそのことについていくつかのアイデアがあります:How to establish a connection pool in JDBC?

接続を使用すると、実行文の一部であるクエリのいずれかのデータを保持していません。したがって、基本的に接続を作成して解放することはメモリには影響しません。しかし、それは関連性の高いパフォーマンスのために正しいです。

ステートメントも閉じることができるので、ステートメントも閉じることができます。

0

1)はい、一度レコードをコミットすると、メモリに属します。 Connectionオブジェクトを閉じる前に必ずコミットしてください。

2)おそらく。開いている接続を閉じるために必要な時間を測定するために、プロセスを記録する必要があります。一般的に、このプロセスには時間がかかりますが、あなたのケースでは、オープン・クローズのための余分な時間があなたのパフォーマンスに大きな影響を与えないかもしれません。最初に測定し、最良のソリューションを決定する必要があります。

関連する問題