- PR -

CGI・環境変数について

投稿者投稿内容
ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 2007-03-02 19:50
あるボタンが押されたら、
POSTしてCGI側でその内容でデータベースを更新しています。
そのときの環境変数の数なのですが
2000個くらいになると、処理時間もすごく遅くなり、挙句にデータベースのオープンエラーという結果になってしまいます。仮想メモリがすくなすぎます・・・などというメッセージも出てしまうのですが、どうやって解決したらいいのかわかりません。

何個までうまくいくのかは、調べていませんが、
500個くらいではデータベースに正常に書かれます。

一度に登録できる件数を制限できればいいのですが、ダメだそうです。

試験環境(Win2003Server、apache、IE6.0)も悪いのかもしれませんが、
JavaScriptでGETで1件ずつDBに書こうとすれば、歯抜けになってしまうし、
POSTに変えれば、DBオープンエラーになるし、途方にくれています。

環境変数の数は多すぎてはダメなんでしょうか。




末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2007-03-02 20:47
こんばんは

環境変数とはpostされたデータのことを言っているのでしょうか?
DBのコネクション、問い合わせの順番がおかしいのではないでしょうか?

0.コネクション
1.DBオープン
2.SQL発行(一件分処理)
3.1(0)に戻る
というような流れで処理していませんか?

0.コネクション
1.DBオープン
2.SQL発行(一件分処理)
3.2に戻る

というような流れになっていますか?

まず、メモリが少なすぎますのエラーがどこで出ているかを特定するのが
早道だと思いますよ
ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 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

というふうにしています。

引き続き、よろしくお願いいたします。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2007-03-02 22:03
DBMSはなにを使用しているのでしょうか?
また、システムの構成はどうなっているのでしょうか?

あと、トランザクションで実行していたりしませんか?
ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 2007-03-02 22:32
oracle9iを使っています。

システム構成は・・・
os:WindowsServer2003
WebServer: apache
  (発生している試験用マシンはapacheです)
  (本番機はIISですが、まだ試していません)
DB: oracle9i

処理は単純に
create → insert(loop) → Commit です。

こんな書き方でいいのでしょうか。
ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 2007-03-02 22:38
件数を試してみました。

106件で57秒かかり、正常でした。
150件で1分19秒かかり、NG(DBオープンエラー)でした。

アプリのログを見ると
ブラウザからのボタンクリックからCGI側に渡るまでに、上記の時間がかかっていて
時間経過後、CGIアプリに入って、main→DB Open error  になっています。

環境変数が多いと やはりこんなに時間がかかるものなのでしょうか。。。

よろしくおねがいします。
未記入
常連さん
会議室デビュー日: 2006/08/09
投稿数: 33
投稿日時: 2007-03-03 01:00
そもそも何故,環境変数経由になるの。
CellのIDをLoopするにしても,一般的には、環境変数以外の方法で実装しませんか?
開発環境もかきませう。

ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 2007-03-03 02:31
今まではWebでここまで複雑なのはやったことがなく、
どんな方法で実現できるか、やっと考えた方法でした。

開発環境はVC++6.0です。
入力チェックなどはJavaScriptでやってます。
はじめは、JavaScriptで1行ずつデータをURL渡しで行ったのですが
IEが追いつかないと言うのか、全部をCGIに渡してくれないのです。

一旦、JavaScriptでファイルに書いて、ファイル渡しも試しましたが
結局Loopさせると書き込みが歯抜けになりました。

Sleepもどきを入れたりしてみましたが
負荷がかかりすぎて、、、そういう時はPOSTだということを教えてもらいました。

一般的にはどのような方法をとるのでしょうか。





スキルアップ/キャリアアップ(JOB@IT)