一般社団法人 全国個人事業主支援協会

COLUMN コラム

個人開発のテスト環境の方で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アプリケーションのコネクション数を下げる

クライアントの方のコネクションのプール数を下げます。

spring.datasource.hikari.maximum-pool-size

spring.datasource.hikari.minimum-idle

がその設定項目です。

minimum-idleが平常時のコネクション数になります。

ちなみに、デフォルトだとminimum-idle:10が設定されている模様です。

Hobby Dev、Hobby Basicのプランではコネクション数が最大20なのですぐオーバーしちゃいますね。

 

application.yml

※ブログサイトの都合でインデントが入力できません。申し訳ありませんが、うまく読み取ってください。

spring:
jpa:
database: POSTGRESQL
show-sql: false
hibernate:
ddl-auto: none
open-in-view: false
datasource:
platform: postgres
url: <<URL>>
username: <<USERNAME>>
password: <<PASSWORD>>
driverClassName: org.postgresql.Driver
hikari:
maximum-pool-size: 4
minimum-idle: 1

 

これだけでもOK?なのかよく分かっていませんが、herokuの方にも対応を加えています。

 

Herokuにpgbouncerを追加

heroku-postgresにコネクションプールを設け、クライアントであるAPサーバ等からは直接接続を行わない設定にします。(認識合ってるか微妙)

まずはheroku CLIでログインします。

heroku login

そしたら、herokuアプリにpgbouncerのbuildpackを追加します。

ちなみに、メモリ使用量が跳ね上がることはなかったので、その辺の心配はいらないと思います。

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

 

次にherokuアプリの「Procfile」を変更します。

herokuは賢くて、このProcfileを配置しなくてもアプリを動かせちゃうので、知らないで使っている人も多いかと思います。

 

herokuにおけるProcfileというのは、ざっくりと言うとアプリケーションをherokuにデプロイする際の設定をするファイルです。

プロジェクトのルートディレクトリに設定内容を記載した「Procfile」という名前のファイルを配置すると、その設定に従ってデプロイしてくれます。

 

ということでpgbouncerの起動コマンドを追記したProcfileを作成します。

 

既にherokuアプリを起動している場合は、対象アプリのOverview > Dyno formationを確認してください。

現在の起動コマンドが記載されています。

この起動コマンドの手前にpgbouncerの起動コマンドを記述します。

web: bin/start-pgbouncer java -Dserver.port=$PORT $JAVA_OPTS -jar target/myapp-0.0.1-SNAPSHOT.jar

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

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア