Heroku + Postgres DB Error: Demasiadas connexiones para este rol
 

Cómo resolver el 'too many connections for the role' error

Click here for the English version.

Si estás utilizando Postgres en la versión gratuita de Heroku, tienes un límite de 20 connexiones concurrentes. Al añadir la connexión 21, se te dará el siguiente error:

FATAL too many connections for role '[role name]'

Entra en tu cuenta Heroku y abre el apartado de Postgres, y verás una utilización de 20/20 connexiones.

Para solucionarlo, en primer lugar hay que averiguar por qué hay tantas connexiones. Para una applicación pequeña, 20 connexiones concurrentes no es muy normal y sugiere un problema en el codigo. En mi caso, utilizando Prisma (mi ORM de base de datos), estaba importando e instanciando el PrismaClient() en cada carga de la página.

import { Prisma } from '@prisma/client'

export async function getServerSideProps(context) {

prisma = new PrismaClient()

/* resto del codigo */

}

Al importar y instanciar el PrismaClient en cada carga, una connexión nueva se abrió cada vez. Dentro de poco llegaba al límete de 20 connexiones concurrentes.

Para empezar a solucionar esto, podemos quitar a todas las connexiones a través de la Heroku CLI. Si todavía no lo has hecho, descarga la Heroku CLI.

Después, entra:

$ heroku login

Tu navegador se abrirá y puedes entrar con tus credenciales. Después se te redirigirá a la CLI. Para quitar todas las connexiones a la base de datos, ejecuta el siguiente comando:

$ heroku pg:killall --app nombredemiapp

Reemplaza 'nombredemiapp' con el nombre de la applicación a la que tu base de datos Postgres está conectada.

Ahora que has quitado a todas las connexiones existentes, puedes continuar a desarrollar, pero tendrás que volver a quitar las connexiones cada vez que llegues a 20 connexiones concurrentes.

Lo mejor es identificar la deficiencia en tu código que está causando que todas estas connexiones se abren.

La solución que yo encontré fue instanciar el PrismaClient en un fichero externo y exportarla.

import { PrismaClient } from '@prisma/client'

let prisma

prisma = new PrismaClient()

export default prisma

Ahora, solamente tengo que importarla en las páginas dónde hago consultas de la base de datos, utilizando la variable 'prisma' que se definó en el fichero externo:

import prisma from '../lib/prisma'

export async function getStaticProps() {

const profiles = await prisma.profiles.findMany()

/* resto del codigo */

¡Espero que esto ayude!

About

Escribo en español e inglés sobre React, NextJS, PHP, y SEO entre otras cosas.

About

Escribo en español e inglés sobre React, NextJS, PHP, y SEO entre otras cosas.

Copyright © 2021 Jack A.