java1.8+butterfly+oracleでテーブルが取得できない問題

このQ&Aのポイント
  • java1.8を使用してButterfly Persistenceを使ってoracle11gにアクセスするwebシステムを作っていますが、4つのテーブルを結合してSELECTを実行すると2回目以降に取得できなくなるテーブルがあり、そのテーブルの情報が全てnullになります。
  • 一時的な解決策として、クエリ発行前にブレークポイントで一旦止めてステップ実行すると正常に取得できることがわかりました。また、クエリ発行後にブレークポイントを設定するとやはりnullになっていますが、そのまま、eclipseの式ビューにクエリを発行している式を入れると正常に取得できます。さらに、クエリ発行の直前に`Thread.sleep(2000)`を入れるとセレクトが成功することもわかっています。
  • 問題の原因は不明ですが、コネクションの切り替えやテーブルの結合方法による影響などが考えられます。関連するメモリ不足の可能性も疑われます。
回答を見る
  • ベストアンサー

java1.8+butterfly+oracle

こんにちわ。 私は今、java1.8から Butterfly Persistenceを使って oracle11gにアクセスするwebシステムを作っています。 実は困ったことが発生しています。 「 ・4テーブルを結合してSELECTを掛ける ・2回目の操作以降、取得できなくなるテーブルがある。 (そのテーブルの情報が全てnullになる) ・クエリ発行前にブレークポイントで一旦止めてステップ実行すると正常に取得する。 ・クエリ発行後にブレークポイントを設定するとやはりnullになっているが、そのまま、eclipseの式ビューにクエリを発行してる式を入れると正常に取得する。 ・クエリ発行の直前にThred.sleep(2000) を入れると何度やってもセレクトが成功する。(上手くいく、nullにならない) 」 です。 ドライバはoci 64bit butterflyのデータベースマネージャーを使用しています。 知りたい事。 何故取得できないテーブルがあるのか? 何故Thred.sleepを入れると取得できる様になるのか? 経緯  このシステムは、もともとmySQLで作られていて、諸事情によりOracleに変換する必要が出てきました。 その変換係に私が指名されました。 mySQLのlongTextを使っていたので、 最初はOracleのLongにしていました。 最初はbutterflyのオブジェクトDaoで1テーブル毎に取得したのですが 1テーブルなぜか検索結果が0になりした。 そこでコネクションを取得して プリペアドステートメントに切り替えたのですが 改善せず いろいろ調べると jdbcドライバでlongを使うと、 最初に読まなきゃならないとかいろいろ成約があり、ORMapperでlongが怪しいと思い、 そこまで長い文字列入らないと思われるので varchar2(4000)にしました。 が、解決しません。 連続して複数のテーブルにセレクトするのが悪いと思い、 テーブルを結合させて butterflyのマップオブジェクトで取得したのですが やはり該当テーブルがnullになりました。 その時はthinドライバだったので、 ociなら大丈夫かと思いociに変換。 (と言いますのも、試験的に該当箇所をasp.net c#に移植し、全く同じセレクト文を投げると全く問題なく動き、 それがoci接続なのでocIにすれば行けると思いました。 asp.netとc#なら問題なかったのでjavaカテゴリに来ました) しましたが上記のとおりです。 javaVMのメモリが不足したかと思い eclipseからtomcatのメモリを1024mに設定しましたが解決せず。 どなたか似たような現象に遭遇した方や 心当たり有る方いますでしょうか?

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

Butterfly Persistenceを使ってるわけじゃないからわからないけど なんかスレッド処理で競合したりしていないかい? ブレークポイント入れるとOKとかスリープ入れるとOKとか。 >(と言いますのも、試験的に該当箇所をasp.net c#に移植し、全く同じセレクト文を投げると全く問題なく動き、 >それがoci接続なのでocIにすれば行けると思いました。 >asp.netとc#なら問題なかったのでjavaカテゴリに来ました ここまで試したなら、余計なライブラリ使わないでJDBCのみで取得してみたら? たぶん取れると思うけど。

okayiamsss
質問者

お礼

お恥ずかしながら何人もの手を渡り歩き悪設計の博物館の様になってプログラムに起因するバグでした。 javascriptから更新、削除挿入、選択のリクエストが別々のajaxで走り、私は選択の箇所だけ見ていたので削除挿入があるとなかなか気づきませんでした。 別のリクエストで削除されたタイミングでセレクトしてたので引っかからなかっただけでした。 スリープ入れると他のajaxの処理が終わるのでうまく行ってただけでした。 ご迷惑お掛けしました

関連するQ&A

  • Oracleで「文字が無効です」のエラーが出ます

    Oracleで「文字が無効です」のエラーが出ます JavaからOracleに接続して、SELECT文を発行していますが、何度試しても上記のエラーが出ます。 発行しているSELECT文を、SQLPlusから打ち込むとちゃんと実行できます。 何が悪いのか見当がつきません。 お知恵をお貸しください。 ちなみに、対象テーブルの項目はvarchar2とnumberだけの項目ばかりで、日本語は使ってません。 また、Oracle初心者です。 環境 端末:WindowsXP Oracle:10g Express Edition ※文字コードはAL32UTF8 IDE:Eclipse3.5 ※設定-一般-ワークスペースのテキストファイルエンコードはUTF-8

  • PostgreSQLからOracleへの移行で

    はじめまして。 PostgreSQL+PHP4で動作していたスクリプトを Oracle+PHP4に移行する作業をしています。 SELECTで取得された行の件数を得る為に、 pg_num_rows(result) を使っている箇所があるのですが、それと 同様の動作をするOCI関数はあるでしょうか? ※都合により、DBアクセス関数は全てOCI関数での 実装を予定しています。 ora_numrows()が使えれば良かったんですけれど。。

    • 締切済み
    • PHP
  • ORACLEでwhere句の検索順序

    Oracle9i windows2000です。 以下のようなテーブルがあります。 table_a ----------------------- id   NUMBER(10,0) NOT NULL, sort   NUMBER(10,0) NOT NULL, name   VARCHAR(10), text   VARCHAR(255) この条件で、以下のふたつのSELECT文を発行した時、パフォーマンスが良いのはどちらですか? Oracleでは後ろから検索されると聞いたことがあるのですが本当でしょうか? ※idにプライマリキー、 id,sortにインデックスが貼ってあります。 (1)SELECT text FROM table_a WHERE id = 1 AND sort = 2 AND name = 'a' (2)SELECT text FROM table_a WHERE name = 'a' AND sort = 2 AND id = 1

  • Oracleのnull

    ちょっとオラクルの検索文で困ったことがでてきました。 temp ------- col1 col2 col3 と言うようなテーブルがあります。 select col1 || '(' || col2 || ')' as col from temp; というような検索文を作成しましたが、テーブルのcol1とcol2が両方とも nullのデータは'()'となってしまいます。 col1とcol2は片方だけがnullと言うことはありません。 col1がnullの場合はcol2もnullです。 このような場合col1とcol2がnullの時は、結果のcolもnullにしたいのですが どうしたら出来るのでしょうか? また、無理なら無理と教えてください。 よろしくお願いします。

  • accessとオラクルの連携について

    お世話になります。アクセスでテーブルのデータをSQL文で取得し、 そのデータをオラクルのテーブルにinsertしたいと思ってます。 ただ、フィールドの数が40個もあるので insert into ・・・・Fields(0),Fields(1)・・・・ と記述するのはかなり面倒なので何かいい方法はないでしょうか よろしくお願いします。 なお、access側とオラクル側のテーブルは同じ型です。 ’ローカルテーブルのデータを取得 rec.Open "select * from tesuto", cnn ’取得したデータをinsertする Do Until rec.EOF sql= insert into value(Fields(0),Fields(1),・・・ rec1.Open "select * from tesuto1", cnn1 Loop

  • 空フィールドが表示されない

    A B C ----- 1 2 1 2 2 3 のようなテーブルを $strSQL = "select A,B,C from XXX"; $parsed = oci_parse( $db , $strSQL ); oci_execute($parsed); $data = oci_fetch_array($parsed, OCI_BOTH ); というコードから参照しようとすると、 Aの値のみしか参照されません。 DB上にデータある場合は、BもCも取得できます。 NULL値も参照するようにするには、どうすればよいのでしょうか?

    • ベストアンサー
    • PHP
  • Oracle 10g 権限付与

    はじめまして Oracle10gで、今度新しいデータベースが始動します。 問題なのが、管理者向けに発行するIDと、一般ユーザ向けに発行するIDの違いです。 管理者には参照・更新、参照権限付与・更新権限付与。 一般ユーザには参照、更新(それぞれテーブルごとに申請を出してもらう)、管理者から権限をもらう。 という仕組みになりました。 月に3度から4度、新しいテーブルができます。そのたびにgrantオプション付で管理者に権限付与するのも大変です。 select anyでは、テーブルごとの切り分けができません。 Oracle10gには詳しくないのですが(そもそもOracleにそんなに詳しくないのですが)、何かOracle10gの新機能など、使えそうなものはないでしょうか。 よろしくお願いいたします。

  • AccessからOrcleのODBCリンクテーブルへの挿入

    OS:XPpro Access:97,2000 Oracle:7 AccessからOracleのODBCリンクテーブルに対して追加クエリを実行すると、 ODBC--リンクテーブル'テーブル名'への挿入に失敗しました。 [Oracle][ODBC Oracle Driver][Oracle OCI]ORA-01461: can bind a LONG value only for insert into a LONG column.(#1461) というエラーが発生します。 メモ型のフィールド'A'をvarchar2(4000)のフィールド'B'に追加する部分で、LeftB(A,4000)としている部分がうまく行かないようようなので、LeftB(A,3000)と丸めてあげると通ります。 質問を纏めますと、 1.varchar2(4000)となっていても、4000Byteのデータを挿入することはできないのでしょうか。 2.発生しているエラーは、私の考えとは別の問題なのでしょうか。 ご回答よろしくお願いします。

  • クエリー : テーブル一覧&定義情報取得

    手元にOracleがなく、実際にクエリーを投げて試すこともできず困っています。以下について教えて下さい。 1.Oracleにて、自分で作ったテーブルの名前の一覧を取得するクエリーを教えて下さい。 2.各テーブルにおいて、定義情報(カラム名、カラムサイズetc)を取得するクエリーを教えて下さい。 よろしくお願いします。

  • AccessからOracleへのリンクテーブル時の型情報?

    Access始めたばかりの初心者です。 現在Oracle10gのデータベースのとあるテーブルを をAccess2000でリンクし、クエリで抽出したものをレポートに表示 しようとしています。 そのテーブル上に、 Oracle上ではVARCHAR2(6バイト)の日付データがあります。 例) 200806 これをAccessのクエリ上で変換し、 "6月" と表示させたいのですが、 なぜかうまくいきません。 Oracle上の項目名が YM だとすると、 Replace(Right([YM], 2), "0", "") & "月" こういった関数でうまくいきそうなものですが・・ もしかしてOracleのVARCHAR2はリンクすると文字列型以外の型として 扱われるのでしょうか・・ どなたかご存じの方、ご教授くださいませ。