- - PR -
CGI・環境変数について
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-03-02 19:50
あるボタンが押されたら、
POSTしてCGI側でその内容でデータベースを更新しています。 そのときの環境変数の数なのですが 2000個くらいになると、処理時間もすごく遅くなり、挙句にデータベースのオープンエラーという結果になってしまいます。仮想メモリがすくなすぎます・・・などというメッセージも出てしまうのですが、どうやって解決したらいいのかわかりません。 何個までうまくいくのかは、調べていませんが、 500個くらいではデータベースに正常に書かれます。 一度に登録できる件数を制限できればいいのですが、ダメだそうです。 試験環境(Win2003Server、apache、IE6.0)も悪いのかもしれませんが、 JavaScriptでGETで1件ずつDBに書こうとすれば、歯抜けになってしまうし、 POSTに変えれば、DBオープンエラーになるし、途方にくれています。 環境変数の数は多すぎてはダメなんでしょうか。 |
|
投稿日時: 2007-03-02 20:47
こんばんは
環境変数とはpostされたデータのことを言っているのでしょうか? DBのコネクション、問い合わせの順番がおかしいのではないでしょうか? 0.コネクション 1.DBオープン 2.SQL発行(一件分処理) 3.1(0)に戻る というような流れで処理していませんか? 0.コネクション 1.DBオープン 2.SQL発行(一件分処理) 3.2に戻る というような流れになっていますか? まず、メモリが少なすぎますのエラーがどこで出ているかを特定するのが 早道だと思いますよ |
|
投稿日時: 2007-03-02 21:08
###環境変数とはpostされたデータのことを言っているのでしょうか?
はい、ブラウザでテーブルで表示してあるデータを1行ずつ、先頭cellにチェックボックスを付け、チェックされている行のデータをDBにINSERTしたいのです。 テーブルには更に他に列数が9個あり、登録するデータの内容を選択ができるようになっていたりします。 各cellに全て<inptut type="hidden" name= value=・・・をつけて、CGIに渡るようにしました。 (DBに書き込むのに必要なデータのみですが。) ####### 0.コネクション 1.DBオープン 2.for(){ ・ 環境変数の取得 ・SQL発行(一件分処理) ・2に戻る 環境変数にテーブルのレコード数も入っているので その件数文LOOPしたら、 3.CGIリターン 4.DB close というふうにしています。 引き続き、よろしくお願いいたします。 |
|
投稿日時: 2007-03-02 22:03
DBMSはなにを使用しているのでしょうか?
また、システムの構成はどうなっているのでしょうか? あと、トランザクションで実行していたりしませんか? |
|
投稿日時: 2007-03-02 22:32
oracle9iを使っています。
システム構成は・・・ os:WindowsServer2003 WebServer: apache (発生している試験用マシンはapacheです) (本番機はIISですが、まだ試していません) DB: oracle9i 処理は単純に create → insert(loop) → Commit です。 こんな書き方でいいのでしょうか。 |
|
投稿日時: 2007-03-02 22:38
件数を試してみました。
106件で57秒かかり、正常でした。 150件で1分19秒かかり、NG(DBオープンエラー)でした。 アプリのログを見ると ブラウザからのボタンクリックからCGI側に渡るまでに、上記の時間がかかっていて 時間経過後、CGIアプリに入って、main→DB Open error になっています。 環境変数が多いと やはりこんなに時間がかかるものなのでしょうか。。。 よろしくおねがいします。 |
|
投稿日時: 2007-03-03 01:00
そもそも何故,環境変数経由になるの。
CellのIDをLoopするにしても,一般的には、環境変数以外の方法で実装しませんか? 開発環境もかきませう。 |
|
投稿日時: 2007-03-03 02:31
今まではWebでここまで複雑なのはやったことがなく、
どんな方法で実現できるか、やっと考えた方法でした。 開発環境はVC++6.0です。 入力チェックなどはJavaScriptでやってます。 はじめは、JavaScriptで1行ずつデータをURL渡しで行ったのですが IEが追いつかないと言うのか、全部をCGIに渡してくれないのです。 一旦、JavaScriptでファイルに書いて、ファイル渡しも試しましたが 結局Loopさせると書き込みが歯抜けになりました。 Sleepもどきを入れたりしてみましたが 負荷がかかりすぎて、、、そういう時はPOSTだということを教えてもらいました。 一般的にはどのような方法をとるのでしょうか。 |