• ベストアンサー

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

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

  • Java
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • CREATE TEMPORARY TABLEを複数回使用できない?

    phpとMySql(4.0.26)でプログラムを作成しているのですが、 CREATE TEMPORARY TABLEでテンポラリーテーブルを3つ作成して、 データの抽出をしようとしています。 phpMyAdminでは動くSQLが、PHP内に書くと動かなくても困っています。 原因を特定するためにSQLを少しずつ削除して確認していたところ、CREATE TEMPORARY TABLEが一つの場合はエラーが出ませんが、違う名前で別のテーブルから生成するもう一つのCREATE TEMPORARY TABLEを書くとエラーが起きてしまいます。 ちなみに、そのSQLを同じサーバに動作させているphpMyAdminのSQL画面にコピペすると、正常に動作します。 何が悪いのか全く検討が付きません。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 3.23.59でのテンポラリテーブルの削除、補完機能について

    お世話になります。 server version: 3.23.59-nightly-20050301 上記バージョンのMySQL使ってシェルのコマンドプロンプトから mysql>CREATE TEMPORARY TABLE `test` (`name` VARCHAR( 255 ) NOT NULL); とテンポラリテーブルを作って mysql>DROP TEMPORARY TABLE test; そのテーブルを削除しようとすると ERROR 1064: syntax error near 'TEMPORARY TABLE test' at line 1 とエラーがでます。 これは仕様なのでしょうか? しかたがないのでいったん接続を閉じてテンポラリテーブルを消してますが server version: 4.0.18 で同じことを行うと正常に削除できます。 また、 server version: 3.23.59-nightly-20050301 だとselectと入力しようとして mysql>sele(タブキー) とやると補完されますが server version: 4.0.18以上だと だと補完されません。(フィールド名は補完できました) なにか設定などが必要なのでしょうか? よろしくお願いします。

  • create temporary tableについて

    MYSQL5.0を利用して、PHPから以下の作業をしています。 create temporary table tempで作成された一時的なテーブル(temp)は削除しなくても問題ないのでしょうか? もし削除する必要がある場合は、drop temp で大丈夫でしょうか?

    • ベストアンサー
    • MySQL
  • access vbaにてテンポラリーテーブルが作りたいです。

    教えてください。 フォームで年月日を入力させ ボタンを押すとテンポラリーのテーブルが出来る(そのあとでその一時テーブルを使ってselect等がしたい)ような仕組みを作りたいと思っています。 ##テーブル名 でいけるかとおもったのですが、 ##テーブル名という実際のテーブルができてしまいました。 記述は下記の通りです。 mySQL = "SELECT テーブルA.* INTO [##table] from テーブルA where 年月 = " & n1 & " " です。 ##テーブル部分を一時テーブルにしたいのですが・・・ どうしたらよいでしょうか? どうぞよろしくお願いします。

  • 別テーブルからselectした値を他のテーブルにinsertしたいのですが、上手くできません

    以下のように行ったのですが、 全ての値が別テーブルにinsertされません。 $sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A "; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $sql = "INSERT INTO tbl_B (          date, id, data ) VALUES ( '" . date( 'Y-m-d' ) . "', '" . mysql_real_escape_string( $col['id'] ) . "', '" . mysql_real_escape_string( $col['data'] ) . "' )"; } このやり方では、テーブル内の1つの値しかinsertされません。 selectされた全ての値をinsertするにはどのようにしたら良いのでしょうか? よろしくお願いします。 DB:mysql5 SP:php5

    • ベストアンサー
    • MySQL
  • JDBCレルムによるFORM認証

    お世話になります。 StrutsのJDBCレルムによるFORM認証について教えて下さい。 パスワードをSHAで暗号化したテーブルを使ってj_security_checkによる認証をさせたいのですが認証エラー(ID、Passwordが誤っています。 )となってしまいます。 DBはMySQLです。 SQLのログを見ると「SELECT password FROM users WHERE email = 'メールアドレス';」というログしか出ません。 このSQLをMySQLで実行すると暗号化されたパスワードが取得されます。 暗号化の方法が間違っているのか、JDBCレルムの指定が間違っているのかのいずれかとは思うのですが切り分け方法がわかりません。 TOMCATのログにもそれらしき情報が出ていないのですが、どのようにしたら認証エラーとなっている原因を調べることができるのでしょうか?

  • JDBCでのinsertについて

    JDBCを使ってDBを扱います。 データベースはPostgresqlです。 Servlet+JSP+Beanで開発しているのですが、 以下のようなinsert処理をBeanで行っています。 String sql_insert = "INSERT INTO tal_ks(cd,kbn)" + " VALUES(" + vl1 + ",'" + vl2 + "')";System.out.println(sql_insert); System.out.println("SQL文発行"); int in = stmt.executeUpdate(sql_insert); System.out.println("(SQL文発行後"); ・ ・ ・ これを行うと、例外処理には流れず 実行したかのように見えるんですが、 実際はデータがはいっておりません。 このSQLと同じものをpsqlで直接実行すると insert できました。 これは、どういうことが原因なのでしょうか? 教えていただきたいです。

    • ベストアンサー
    • Java
  • [PostgreSQL]別DBのテーブルのSelect、Insert

    お世話になっております PostgreSQL8.1を使用しまして あるテーブルにInsertがかかると その内容を判断し別のテーブルに insertをする仕組みが必要になり いろいろ試してみて TriggerとFunctionを使用すれば 実装できるとこまでわかりました。 ただしその別テーブルが別DBに配置されているので そのテーブルに以下のようなInsert文を発行しても エラーになってしまいます。 Insert into SUB_DB.TEST_TBL values('test','date'・・・・); (SUB_DB:ストアドを実行しているのとは別のDB) ストアドから別テーブルを参照更新する手段を ご存知のかたご教授いただけますでしょうか。 よろしくお願いいたします。

  • JAVAのJDBCについて平易に教えてください

    IT勉強超初心者です。教科書に JDBCは javaプログラムからリレーショナルデータベースにアクセスするための API(外部の別のプログラムから呼び出してソフトの機能などを利用するためのしくみ)である。SQL言語による命令を発行してDBの操作を行えるとあるのですが 素人には 大変イメージがわきにくい説明です。 実際開発弁場でこのJDBCというのは 頻繁に使われているものなのでしょうか。また一般常識なのでしょうか。たとえば 大きな会社の基幹システムの開発などでもこのJDBCは使われるのでしょうか。 どのような場合によく使われるのでしょうか。  やさしくおしえていただけますと幸いです。

    • ベストアンサー
    • Java
  • JDBCドライバについて

    JavaからアクセスしたいのでJDBCドライバをインストール、設定しようとしたのですが、Tomcatに組み込むやり方がわかりません。このサイトを参考にしてやったのですが・・・ << db105.java >> データベース(0):JDBCドライバ JavaのプログラムからMySQLのデータベースへ接続するにはJDBCドライバが必要である。 ●JDBCドライバのダウンロードとインストール (1)Webブラウザで、http://www.mysql.com/downloads/に接続する。 ダウンロードするバージョン(MySQL Connector/J 3.0)をクリックする。 (2)http://dev.mysql.com/downloads/connector/j/3.0.htmlに切り替わる。Downloadをクリックする。 (3)ダウンロードが始まるので、保存先をデスクトップにする。ファイル(mysql-connector-java-3.0.15-ga.zip)がデスクトップに保存される。 (4)ZIP形式のファイル(mysql-connector-java-3.0.15-ga.zip)を解凍する。デスクトップ上のディレクトリ(mysql-connector-java-3.0.15-ga\mysql-connector-java-3.0.15-ga)内のファイル(mysql-connector-java-3.0.15-ga-bin.jar)にJDBCドライバが存在する。 (5)JDBCドライバを環境変数CLASSPATHに追加する。 SET CLASSPATH=%CLASSPATH%;c:\mysql-connector-java-3.0.15-ga\mysql-connector-java-3.0.15-ga-bin.jar;. ただし、JDBCドライバは、 c:\mysql-connector-java-3.0.15-ga\mysql-connector-java-3.0.15-ga-bin.jarに存在する。 ●Tomcatに組み込む。 ファイル(mysql-connector-java-3.0.15-ga-bin.jar)を %CATALINA%\shared\libの下にコピーする。その後、再起動する。 2番目の黒丸の%CATALINA%\shared\libが全くみつからないです。教えてください~;;

    • ベストアンサー
    • MySQL

専門家に質問してみよう