[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.jp
◇ http://www.digitune.org/
pgsql-jp メーリングリストの案内