2012-02-03 15 views
3

私はデータベースと対話するためにPDOを使用してpostgresqlバックエンドを持つPHPアプリケーションを持っています。数ヶ月間問題なく立ち上がっていますが、突然今夜、データベース接続が必要なページのロードで永続的な500エラーが発生し、サーバーのerror.logファイルには次のように表示されます。postgresql非スーパーユーザーのためにPHPの接続制限を超えました

PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[08006] 
[7] FATAL: connection limit exceeded for non-superusers' 

データベースに接続するユーザーのrollconnlimitが-1であるため、これは問題ではありません。 pg_stat_activityテーブルを照会すると、接続が見えません。

これを引き起こす原因は何ですか?多かれ少なかれデータベース接続が発生するようなコードは変更していません。

いくつかのコードを投稿してもうれしいですが、私のコードのどの部分が問題を引き起こしているのかについての指針なしに投稿するのは確実ではありません。

+0

固定モード接続を使用していますか? http://stackoverflow.com/questions/3332074/what-are-the-disadvantages-of-using-persistent-connection-in-pdo – GordonM

+0

いいえ、私は一回限りの接続を使用しています(私は、あなたにリンクして答えてください!)ので、彼らは死んでいるはずです。私はいくつかのより多くのデバッグを行いましたし、私のコードで問題があると考えています。既存のdbメソッドを使用して、各ループ(怠け者)の単一項目を取得するのではなく、それら。 – Alpaus

答えて

3

Postgresエラーの直接の理由は、おそらくmax_connectionsの設定です。

あなたのコメントで読んだことは、実際にに修正する必要があります。 1レコードごとにDBにアクセスし、アプリ内でローカルにループするのが最悪のシナリオです。

すべての行を一度に取得し、それらをアプリケーションで処理することははるかに優れていますが、それでも良くありません。できるだけ、データベースエンジンのプロセスデータを用意し、アプリケーションで必要な結果のみを取得する必要があります。それがデータベースエンジンが得意とするものです。大量のデータを出荷する必要はなく、実際にはわずかな部分しか使用しません。 I wrote more here

+1

ありがとうアーウィン、申し訳ありませんが、私は自分の携帯電話で書いていたので、あまりにも短いです。現時点では、クエリを使用してIDを取得し、それらのIDをループしてそれぞれの詳細を取得するPHPオブジェクトに渡します。ルーキーミス!私の好み(と私はコードを変更する予定です)は、最初の(フィルタリングされた)クエリで必要なすべてのデータを取り戻し、結果セットを出力してループするように元のクエリを変更します。 – Alpaus

関連する問題