[pgsql-jp: 36476] JDBCのAutoCommitが不安定?

Tomotaka Murata tomo-murata @ hitachisoft.jp
2005年 12月 1日 (木) 17:17:17 JST


村田と申します。
はじめまして。

現在稼動中のシステムにて、開発APが意図せずテーブルをロックしてしまい、
夜間に実施しているVACUUM等が停止する事象が発生しましたので、
その原因と対処について情報が得られればと思い投稿させて頂きます。

【動作環境】
OSはRedHat Linux 9、PostgreSQLバージョンは7.4.2です。
VACUUMは、"VACUUM FULL ANALYZE"を実行しています。
開発APはJavaAPで、J2SE JREは1.4.2_04、PostgreSQL JDBC Driverは7.2を
使用しています。
それは、VACUUMとほぼ同じ時間帯に、処理を開始可能な状態になったか否か、
DBのフラグ(あるテーブルのあるカラム)を1分間隔でSELECTしてチェック
しています。

【事象発生時の状況】
psコマンドでプロセス状況を確認したところ、VACUUMコマンドがwaitingに
なっていました。
またその際、開発APのプロセスがトランザクション処理中になっていました。

postgres 30827  2836  0 02:46 ? 00:00:01 postgres: usr1 mydb x.x.x.x idle in transaction
postgres 30972  2836  0 02:47 ? 00:00:01 postgres: usr2 mydb y.y.y.y VACUUM waiting

これより、開発APがSELECTしたテーブルがロックされており、そのテーブルを
VACUUMする時点で停止したものと思われます。

【開発APの実装】
// コネクションの取得
DriverManager.getConnection
※この段階では、Connection.setAutoCommit(true);の状態であるハズ。
 …
while (true) {
    // SELECT文発行(繰り返し)
    Connection.createStatement();
    Statement.executeQuery("SQL文");
}

【再現確認】
AutoCommitがTrueであるため、SELECT文発行してもテーブルをロックせず、
開発APは"idle"になることを期待しますが、検証したところ、極低確率にて
上記結果になることがあります。

また、以下のテストコードを実行しても、同様の結果になりました。
while (true) {
    Connection.setAutoCommit(false);
    // SELECT文発行
    Connection.commit();
    Connection.setAutoCommit(true);
}

※以下ページで報告されている内容も同事象と思われます。
http://www.aoindustries.com/clientarea/FAQ.ao?category=postgresql&page=vacuum_delay

【質問内容】
原因として何が想定されますでしょうか?
もしJDBC不具合の場合、それが解消されたバージョンは存在するので
しょうか?
分かる範囲で構いませんので、情報提供頂ければと思います。
よろしくお願いします。




pgsql-jp メーリングリストの案内