- - PR -
PostgreSQLでの一時テーブルについての質問
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-01-22 16:11
みなさんこんにちわ。
サーブレットでPostgreSQLを使っているのですが。 PostgreSQLで一時テーブルを作成するために、 CREATE TEMPORARY TABLE xxx.... というような感じでテーブルを作成しました。 マニュアルでは、この一時テーブルはセッション毎に独立していると書いてあるのですが、 ブラウザを二つ立ち上げて確認してみると、 同じテーブルを参照しているような状態となっています。 レコード1つ挿入した後、全てのレコードを表示するプログラムを作ったのですが、 ブラウザAでプログラムを動かした後、ブラウザBでもプログラムを動かすと、 ブラウザAでの挿入内容がブラウザBにも表示されます(ブラウザABとも同じテーブルをアクセスしている)。 ちなみに、ブラウザAとBは同じPCで動かしています。 セッションはPC毎に区切られるのでしょうか?それならば納得いくのですが。。。 | ||||
|
投稿日時: 2006-01-22 17:14
ブラウザからアクセスしているとはいえ、DBへアクセスしている実体は
Webサーバですから、あたりまえの動作です。 PCを変えても同じです。 | ||||
|
投稿日時: 2006-01-22 18:43
例えば、 ブラウザAで、挿入したレコードが2件だとすると、 ブラウザBで、処理を動かすと、レコードが4件になる、といっていますか? この前提が間違っていなければ、以下の質問に答えてもらえますか? 質問1 ブラウザB で SQL を4回発行している、という事はありませんか? プログラムの作りによりますが、変数のスコープによってはあり得る状況と思います。 質問2 DB への接続はどのようにしておこなっていますか? 質問3 上記の例で、ブラウザBが4件になるのであれば、ブラウザC で処理を行なうと、 6件になるんでしょうか。 質問4 使用されている Postgres のバージョンを教えて下さい。 | ||||
|
投稿日時: 2006-01-22 18:55
データベースのセッションとサーブレットのセッションがごっちゃになっている?
| ||||
|
投稿日時: 2006-01-22 18:57
回答ありがとうございます。
>例えば、 >ブラウザAで、挿入したレコードが2件だとすると、 >ブラウザBで、処理を動かすと、レコードが4件になる、といっていますか? はい、そうです。 ブラウザBでも2件挿入する事になるので、4件になります。 >質問1 ブラウザB で SQL を4回発行している、という事はありませんか? プログラムの作りによりますが、変数のスコープによってはあり得る状況と思います。 この可能性は無いと思います。 >質問2 DB への接続はどのようにしておこなっていますか? DataSourceを使用して接続しています。 >質問3 上記の例で、ブラウザBが4件になるのであれば、ブラウザC で処理を行なうと、 6件になるんでしょうか。 はい、そうなります。 >質問4 使用されている Postgres のバージョンを教えて下さい。 Ver1.4.1です。 Windows版です。 [ メッセージ編集済み 編集者: うる 編集日時 2006-01-22 18:58 ] | ||||
|
投稿日時: 2006-01-22 19:47
>データベースのセッションとサーブレットのセッションがごっちゃになっている?
同じものだと思ってました。 サーブレットのセッションで一時的なテーブルを作成する方法はありませんでしょうか。 | ||||
|
投稿日時: 2006-01-22 19:58
PostgreSQL にはサーブレットのセッションは伝わっていませんので、分けて考える必要がありますね。
サーブレットのセッションIDをもとにテーブルを作るとか、毎回テーブルを作るのではなくセッションIDをキーにしてデータを insert するとかはどうでしょう? | ||||
|
投稿日時: 2006-01-23 03:34
それは、Postgres ではなくて、PowerGres ですよね? # ベースとなっているのは、Postgres 7.3.9 らしいです。 CREATE TEMPORARY TABLE を実行する際に「ON COMMIT」は 記述されていますか? この場合ですと、デフォルト動作の「PRESERVE ROWS」ではなく、 「DELETE ROWS」もしくは、「DROP」が求められているとおもいます。 |
1