2016-05-12 13 views
1

200カラムのテーブルに50000行のローを試してみます。私はexecuteBatch()を1000行ごとに行います。そして、私はこのテーブルのためにロックされます。同じコードがMS SQLとOracleで動作しますが、postgresqlでこの問題が発生します。 executeBatchの数値を1000から75に減らすと、すべて正常に動作します。PostgreSQLでJDBC executeBatch()がエラーなしでハングします

設定ファイルにバッチバッファサイズに対応するパラメータがありますか?

同じ問題http://www.postgresql.org/message-id/[email protected]

+1

あなたのアプリケーションのメモリ使用量をチェックしたことがありますか?ドライバがGCを頻繁に探すようにメモリを消費する可能性があります。たぶん単純にヒープサイズを増やすだけでも十分でしょう。 –

+0

私はこれをアプリとは別に実行します。データベースのファイルからデータをロードするだけです。 – Andrew

+0

それを確認してください –

答えて

1

st.executeBatch()を呼び出すときに、多数の列を持つテーブルに対してinsertステートメントを一括して実行すると、ハングすることがあります。 postgresql jdbcドライバに固有です。 この問題を回避するには、ソケットのバッファサイズパラメータ(SO_SNDBUF、SO_RCVBUF)を増やす必要があります。

[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Afd \Parameters] 

DefaultReceiveWindow(タイプ= DWORD)= 1640960(10進数) DefaultSendWindow(タイプ= DWORD)= 1640960(10進数)

これを:Windowsの場合

我々はレジスタに、そのようなのparamsを作成する必要がありますnumber(1640960)私は一般的な推奨としてインターネットから手に入れます! それは私のために働く。

0

一般的に次のようなものを探す必要があります。

  1. 実際にテーブルのロックを取得できますか?
  2. 他にもJavaコードロックがありますか?そして、その後など

一般的にチェックするための最初の場所で待っている、アイドル、クエリが実行されているかを示し、それがアクティブであるかどうかだろうpg_stat_activity system図であり、それが待機している場合(つまりwaitingtです)、 pg_locksのビューを確認して、その中に何が他のものにロックされているかを確認することができます。

待機が真実でない場合は、クライアント側のロックについてJavaコードをチェックするほうが良いですが、これはMySQLとOracleでうまく動作するため、これは問題ではないと思います。

もう1つ注意が必要です。私はここでMySQLとOracleについてはわかりませんが、PostgreSQLは接続ごとに一度に1つのクエリに制限します。あなたはそこにロックしているかもしれませんか?

+1

私はこの場合のような同じ問題があります。http://www.postgresql.org/message-id/[email protected] – Andrew

+0

pg_stat_activity内の、挿入クエリの状態=アクティブ待ち= f。ロックなし – Andrew

+0

接続プールの場合、私は間違いなくプーリングロジックのJavaオブジェクトロックを疑うでしょう。 –

関連する問題