• ベストアンサー

JDBCでテンポラリテーブルを扱う

JDBCを使って、テンポラリテーブル(DBはMySQL)を作成したのですが、CREATE文を発行したクラス内では、INSERT,SELECTできるのですが、別クラス(別画面から別業務クラス)で、テンポラリテーブルにアクセスしようとすると、 テーブル名 doesn't exist というエラーが出てアクセスできません。 どこに原因があると考えられるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • akira-h
  • ベストアンサー率80% (4/5)
回答No.4

>DBに同じユーザ名で、複数のブラウザでconnectした時は、ブラウザの数だけセッションができるのでしょうか? そうですね。出来てしまいます。JDBCでConnectするとDBのsessionが1個出来ますし、ツールを使ってDBにアクセスしてもDBのsessionが1個出来ます。 WEBシステムでは、多数の人がアクセスしてもConnectionが増え続けないように、コネクションプールを使用してConnection数の制限をかけているわけです。 >今、作っているのは、仮想ショッピングサイトみたいなのを作っていて、お買い物かご情報をテンポラリテーブルに して、各ユーザごとに独立したテンポラリテーブルを持つというふうなことがやりたいのですが、全て同一ユーザのconnectで可能でしょうか? 1ユーザーに対して1テーブルを作るとなると1ユーザーに対して1Connectionという形を取らなければいけないと思います。そうするとサイトの中に入る人数を制限しないといけなくなりますよね。 制限をするのが嫌ならば、テンポラリーテーブルを汎用的にするのはどうでしょうか? たとえば、買い物かご情報のテーブルに商品情報の他にユーザーIDのカラムを追加して識別をするとか。そうすれば1テーブルですべてのユーザーの買い物かごとすることが出来ますよね。 テーブルの持ち方で色んな考えが出来ると思います。

mikmik_a
質問者

お礼

色々教えていただきありがとうございます。 テンポラリテーブルを使うとconnectしっぱなしにしなければならなくて、もし開いたままの状態でブラウザを閉じたりしたら、connectした状態で終了してしまい、不具合が発生する原因となるので、今回は、テンポラリテーブルは止めて、普通のテーブルに複数人のかご情報を格納しようと思います。

その他の回答 (3)

  • akira-h
  • ベストアンサー率80% (4/5)
回答No.3

>セッションを保持するには、最初の画面でcloseしない & 別クラスでconnectしないでアクセスすればいいのでしょうか? そうですね。そうすればうまくいくと思います。 ただ、DBのsession数は制限があるので、そのシステムを使用する人が多くなるとsessionを取得できなくなる(DBにアクセスできなくなる)恐れがあるので、終わったらちゃんとcloseしてください。バグの原因になりますので。 >それとも、コネクションプーリングとかを使わなければならないのでしょうか? コネクションプールは、Connectionを戻すときにcloseしてプールしている可能性があるので、一概に良いとは言えません。それと、コネクションプールって、複数のConnectionを保持しているはずなので、テンポラリーテーブルを作成したConnecitonを再び持ってこれるかというとわからないですよね。 私が思うに、テンポラリーテーブル用Connectionをひとつ用意しておいてそれを皆で使い回しすればいいのでは、と思っています。排他制御(syncronized)をしなければいけないですけどね。

mikmik_a
質問者

補足

ご回答ありがとうございます。 あと、疑問に思ったのが、 DBに同じユーザ名で、複数のブラウザでconnectした時は、ブラウザの数だけセッションができるのでしょうか? 今、作っているのは、仮想ショッピングサイトみたいなのを作っていて、お買い物かご情報をテンポラリテーブルに して、各ユーザごとに独立したテンポラリテーブルを持つというふうなことがやりたいのですが、全て同一ユーザのconnectで可能でしょうか?

  • akira-h
  • ベストアンサー率80% (4/5)
回答No.2

テンポラリテーブル作成時のコネクション(session)と別クラスからテンポラリテーブルにアクセスするコネクション(session)が同一であれば見れるはずです。 多分、別業務クラスでは新たにコネクションを作成していると思います。そうすると別セッションからのアクセスということで、テーブル名 doesn't existエラーが出ているのではないでしょうか? 別業務クラスにテンポラリテーブルを作成したコネクションを引数かコンストラクタで渡してそのコネクションを使用してアクセスすれば見れると思います。 mikmik_aさんが補足で言ってある通り、WebのsessionとDBのsessionは別物です。

mikmik_a
質問者

補足

どうやら、各クラスでconnectして、その後closeしているので、セッションが切れていたようです。セッションを保持するには、最初の画面でcloseしない & 別クラスでconnectしないでアクセスすればいいのでしょうか? それとも、コネクションプーリングとかを使わなければならないのでしょうか?

  • akira-h
  • ベストアンサー率80% (4/5)
回答No.1

create文を発行したときのユーザーと、別業務・別クラスでテンポラリーテーブルにアクセスする時のユーザーは同じでしょうか? 各クラスでデータベースにアクセスするときに同一のユーザでデータベースにコネクトしていないか、確認してみてください。

mikmik_a
質問者

補足

CREATEを行ったユーザと、SELECTを行ったユーザは同一ユーザです。テンポラリテーブルはセッションが続く間保持されると書いてあったのですが、Webアプリのセッションとはまた別物なのでしょうか?

関連するQ&A