otkken2のプログラミング備忘録

学習の備忘録。自分向け

FATAL: too many connections for role ..."に対して、自分がとった対策(Django/Heroku)

Djangoで作ったアプリをHerokuにデプロイして動作確認などしていた。しばらくそれを続けていたところ、あるページでInternal Sever error が表示されてしまい、「なんだ?」と思いリロードしてみるときちんと表示されたり、あるいはエラーのままだったり。



こんなん恥ずかしくて他人様に見せられん!



ということで解決策を探っておりましたのでその辺りを記事に残しておこうと思う。

ターミナルで

$ heroku logs

を打つ。
これでどんなエラーメッセージが出ているか確認。


そうするとでていたのがこれ↓

FATAL:  too many connections for role "..."

ぐぐったところ、

$ heroku pg:killall

をすればよいとか書いてあったので実行したが、アプリをいじってまたしばらくすると同じerror画面に。

ムキー


気を取り直して別の解決策を探る。


そして発見したのが以下の記事
stackoverflow.com

この記事の質問に対する返答で、こういった文言があった

「Seems like the connections are not being reused and/or a new thread is being created for each request.」

超訳すると
・コネクションが再利用されていないっぽい。
・新しいスレッド(すれっどってなに?)がリクエストの度に作られている。



とのこと。なるほど〜。
そして意気揚々と、その回答者が示してくれた解決策を実行してみたのだが、残念ながらまた同じ現象は起こってしまった。


そして再びGoogleの旅に出るわたくし。

そして次に出会った↓の記事で、どうやら解決したっぽい。

stackoverflow.com


これによると、herokuの「pgbouncer」なるものを導入することで解決したらしい。
なんじゃそれとおもいググってみると、
devcenter.heroku.com

コネクションをリミット(制限)してくれるものらしい。おおおおおこれの予感!

早速試してみよう!

ターミナルで次のコマンドを実行

$ heroku buildpacks:add https://github.com/heroku/heroku-buildpack-pgbouncer

これで

$ heroku open

してみると。


今度はしょっぱなからServer Error!!

しかし、これは想定内。なぜなら上の記事でこのやり方を書いてくれた方が予め、「このコマンド実行すると最初はこんなエラーメッセージが出るよ!」
と教えてくれていたから。

そのエラーメッセージとはちなみにこんなやつ↓

heroku server does not support SSL, but SSL was required

で、じゃあこれをどのように解決するかといえば、↓のページに書いてある。

github.com

該当部分を超訳すると、
「私はデータベースの設定に自動的に加えられる”sslmode: required”を取り除く必要があったのだ。

それは
(settings.pyで)

django_heroku.settings(locals())

と書かれている場所の後に、

del DATABASES['default']['OPTIONS']['sslmode']

を書き加えることによって可能になる

とのこと(適当訳だから細かいこと言わない!)

これをやってから、
git add -A .

して、

git commit -m " コメント"

して、

git push heroku master

して、

heroku open

でアプリをブラウザに表示。


GETリクエストを大量に出すべくひたすらページ遷移などしまくってみているが、今のところ500エラーは起きていない。

このまま順調でいてくれ!!!


ではさよなら。