個人開発のテスト環境の方でheroku-postgresのコネクションが足りずに困ったのでちょっとだけメモ。
あ、一応herokuの公式をちゃんと読めば問題なくイケますw
heroku-postgresql 12.7
Spring Boot 2.5.1
HikariCP
org.postgresql.util.PSQLException: FATAL: too many connections for role “<<ユーザ名>>”
「あなた接続しすぎよ!」って言ってますね。
herokuのHobby Dev、Hobby Basicのプランではコネクション数が20と定められています。
それを超えていると発生します。
クライアントの方のコネクションのプール数を下げます。
spring.datasource.hikari.maximum-pool-size
と
spring.datasource.hikari.minimum-idle
がその設定項目です。
minimum-idleが平常時のコネクション数になります。
ちなみに、デフォルトだとminimum-idle:10が設定されている模様です。
Hobby Dev、Hobby Basicのプランではコネクション数が最大20なのですぐオーバーしちゃいますね。
application.yml
※ブログサイトの都合でインデントが入力できません。申し訳ありませんが、うまく読み取ってください。
これだけでもOK?なのかよく分かっていませんが、herokuの方にも対応を加えています。
heroku-postgresにコネクションプールを設け、クライアントであるAPサーバ等からは直接接続を行わない設定にします。(認識合ってるか微妙)
まずはheroku CLIでログインします。
そしたら、herokuアプリにpgbouncerのbuildpackを追加します。
ちなみに、メモリ使用量が跳ね上がることはなかったので、その辺の心配はいらないと思います。
次にherokuアプリの「Procfile」を変更します。
herokuは賢くて、このProcfileを配置しなくてもアプリを動かせちゃうので、知らないで使っている人も多いかと思います。
herokuにおけるProcfileというのは、ざっくりと言うとアプリケーションをherokuにデプロイする際の設定をするファイルです。
プロジェクトのルートディレクトリに設定内容を記載した「Procfile」という名前のファイルを配置すると、その設定に従ってデプロイしてくれます。
ということでpgbouncerの起動コマンドを追記したProcfileを作成します。
既にherokuアプリを起動している場合は、対象アプリのOverview > Dyno formationを確認してください。
現在の起動コマンドが記載されています。
この起動コマンドの手前にpgbouncerの起動コマンドを記述します。
Spring Bootの場合はこうです。
対応完了。
まぁ、3割くらいしか理解してないですが、テスト環境に時間を割くのは惜しいので今回はこれで撤退しますw
https://devcenter.heroku.com/ja/articles/best-practices-pgbouncer-configuration
https://devcenter.heroku.com/ja/articles/database-connection-pooling-with-clojure#limit-connections-with-pgbouncer