[pgsql-jp: 32138] Re: Rule と Lock

Tsunehisa Kazawa kazawa @ ca2.so-net.ne.jp
2004年 1月 28日 (水) 00:17:53 JST


加澤です。石井さん、いつもどうもありがとうございます。

Tatsuo Ishii wrote:
> いえいえ,大変面白く読ませていただきました.それにしても強引というか:-)

あはは(汗。やっぱりちょっと強引でしょうか…。

> でも,既存の機能だけを使って曲がりなりにも「パーティショニング」もどき
> が実現できてしまうところがPostgreSQLのすごいところだと思います.
> # 今度は同じような手で「パラレルクエリー」もどきを作ってみたいと思いま
> # す.

まったくです。PostgreSQL は普通の RDBMS (商用のものなど) と比べてみると
独特な点がたくさんありますが、アプリケーションの規模の対して全体の設計が
とてもシンプルにまとまっていて、見通しがよく応用を効かせやすいように感じ
ます。

# ちょこっと信者発言ですね(笑。

> ところで,daily_logに対する検索はどうされているのでしょう?明示的にア
> プリケーションの方でdaily_log01とdaily_log02に振り分けているのでしょう
> か? それならば,daily_log01とdaily_log0がdaily_logを継承するようにすれ
> ば,アプリケーションはdaily_logだけを検索すれば済むようになります.

Select は view を使うか、やっぱり rule でゴリゴリやろうかと考えていまし
た (とんでもない rule になるだろうなぁ…とぼんやり思っていました)。継承を
使う方法はまったく知りませんでした。とても参考になります。

>>この段階で、試しに JDBC 経由で daily_log テーブルに insert しようとして
>>みたところ、「予期しない result が来た」というようなエラーを吐いてうまく
>>insert 出来なくなっていました。
> 
> これがJDBCドライバのバグなのか,はたまたバックエンドのバグなのか気にな
> ります.本家に問い合わせてみます.

もう少し詳細を説明しますね。利用した JDBC ドライバは PostgreSQL JDBC
Drivers (http://jdbc.postgresql.org/) から入手した pg74.1jdbc3.jar です。

JDBC では普通、insert 等の更新系 SQL は Statement#executeUpdate メソッド
などを利用して実行するのですが、元々のルールが設定された状態で
executeUpdate すると、次のような例外が発生します。

dummy @ tpx20:~$ java -cp .:pg74.1jdbc3.jar test
Exception in thread "main" org.postgresql.util.PSQLException: A result
was returned when none was expected.
        at
org.postgresql.jdbc1.AbstractJdbc1Statement.executeUpdate(AbstractJdbc1Statement.java:273)
        at
org.postgresql.jdbc1.AbstractJdbc1Statement.executeUpdate(AbstractJdbc1Statement.java:257)
        at test.main(test.java:10)

ちなみに、PostgreSQL 側はこのままの状態で、Java プログラム側で更新系 SQL
を実行する executeUpdate ではなく、参照系 SQL を実行する executeQuery に
切り替えると正常に処理出来てしまいます。

# executeQuery に insert 文を入れるのはかなり違和感があります(笑。

なんとなく現象だけ見ると、JDBC Driver 側が予想している結果とバックエンド
が返す結果が食い違っているだけのような気がします。

以上です。テストに使った Java プログラムを添付します。

import java.sql.*;

public class test {
    public static void main(String[] args) throws Exception {
        Class.forName("org.postgresql.Driver");
        Connection conn = DriverManager.getConnection(
            "jdbc:postgresql://localhost/testdb", "dummy", "");
        conn.setAutoCommit(false);
        Statement stat = conn.createStatement();
        stat.executeUpdate(
            "insert into daily_log (log_memo) values ('hoge')");
/* こちらならば元のままの rule でもエラーになりません。
        stat.executeQuery(
            "insert into daily_log (log_memo) values ('hoge')");
*/
        conn.commit();
        stat.close();
        conn.close();
    }
}

-- 
  ◇   加澤恒央 Tsunehisa KAZAWA
◇  ◇ mailto:kazawa @ ca2.so-net.ne.jphttp://www.digitune.org/




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