インターフェイス、ファイアウォール、プロキシなどの基本的なネットワークと、DBサーバーのハードウェア要素をすでに確認していると仮定します。
オプション1:
代わりに:
Class.forName("oracle.jdbc.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//xxx.xxx.xxx.xxx:1521/orcl", "user", "pass");
使用してみてください:
OracleDataSource ods = new OracleDataSource();
java.util.Properties prop = new java.util.Properties();
prop.setProperty("MinLimit", "2");
prop.setProperty("MaxLimit", "10");
String url = "jdbc:oracle:oci8:@//xxx.xxx.xxx.xxx:1521/orcl";
ods.setURL(url);
ods.setUser("USER");
ods.setPassword("PWD");
ods.setConnectionCachingEnabled(true);
ods.setConnectionCacheProperties (prop);
ods.setConnectionCacheName("ImplicitCache01");
詳細
オプション2:フェッチサイズ
スティーブンが強く指摘しているように、fetchsizeは大きすぎるようです。
また、フェッチサイズが500,000の場合、-Xmsと-Xmxは何ですか。また、プロファイラーでは、最大のヒープサイズは何ですか?
オプション3:DB
-
src_schema.big_table_view
のインデックスとクエリプランを確認します -
これはツールですか、それともアプリケーションシステムですか。ツールだけの場合は、DBシステム機能に基づいて、並列度、インデックスヒント、パーティショニングなどを追加できます
オプション4:スレッド
n
と言います <アプリケーションサーバー上のコアの数
n
を開始できます それぞれが特定のバケットを処理するように構成されたライターのスレッド。 thread1は0から10000を処理し、n
に書き込みます さまざまなファイルを作成し、すべての処理が完了したら、結合後に、できれば低レベルのOSコマンドを使用してファイルをマージします。
とは言うものの、これはすべて、現在のように事前定義されたコードであってはなりません。 'n'
バケットは実行時に計算する必要があります。そして、システムがサポートするよりも多くのスレッドを作成するのは、ねじ込みだけです。
オプション5:
の代わりに
select * from src_schema.big_table_view
使用できます
SELECT column1||CHR(9)||column2||CHR(9).....||columnN FROM src_schema.big_table_view
これにより、500000 StringBuilders
の作成が回避されます。 およびStrings
。 (他の複雑なフォーマットが含まれていないと仮定します)。 CHR(9)はタブ文字です。
オプション6:
それまでの間、DBシステムの問題についてDBAに確認し、Oracleサポート を使用してSRを発生させることもできます。 。