Получение внутренней ошибки сервера при развертывании prisma - PullRequest
4 голосов
/ 06 июля 2019

У меня есть база данных Postgres на Heroku, при развертывании модели данных с помощью prisma deploy часто возникает следующая ошибка.

ERROR: Whoops. Looks like an internal server error. Search your server logs for request ID: local:cjxrmcnpx00hq0692zuwttqwv

{
 "data": {
   "addProject": null
 },
 "errors": [
   {
     "message": "Whoops. Looks like an internal server error. Search your server logs for request ID: local:cjxrmcnpx00hq0692zuwttqwv",
     "path": [
       "addProject"
     ],
     "locations": [
       {
         "line": 2,
         "column": 9
       }
     ],
     "requestId": "local:cjxrmcnpx00hq0692zuwttqwv"
   }
 ],
 "status": 200
}

и при проверке логов Docker я вижу этот erorr:

Jul 14, 2019 12:18:34 PM org.postgresql.Driver connect
prisma_1  | SEVERE: Connection error: 
prisma_1  | org.postgresql.util.PSQLException: FATAL: too many connections for role "bcueventxumaik"  
prisma_1  |     at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2433)
prisma_1  |     at org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2566)
prisma_1  |     at org.postgresql.core.v3.QueryExecutorImpl.<init>(QueryExecutorImpl.java:131)        
prisma_1  |     at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:210)
prisma_1  |     at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
prisma_1  |     at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195)
prisma_1  |     at org.postgresql.Driver.makeConnection(Driver.java:452)
prisma_1  |     at org.postgresql.Driver.connect(Driver.java:254)
prisma_1  |     at slick.jdbc.DriverDataSource.getConnection(DriverDataSource.scala:101)
prisma_1  |     at slick.jdbc.DataSourceJdbcDataSource.createConnection(JdbcDataSource.scala:68)      
prisma_1  |     at slick.jdbc.JdbcBackend$BaseSession.<init>(JdbcBackend.scala:453)
prisma_1  |     at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:46)
prisma_1  |     at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:37)
prisma_1  |     at slick.basic.BasicBackend$DatabaseDef.acquireSession(BasicBackend.scala:249)        
prisma_1  |     at slick.basic.BasicBackend$DatabaseDef.acquireSession$(BasicBackend.scala:248)       
prisma_1  |     at slick.jdbc.JdbcBackend$DatabaseDef.acquireSession(JdbcBackend.scala:37)
prisma_1  |     at slick.basic.BasicBackend$DatabaseDef$$anon$2.run(BasicBackend.scala:274)
prisma_1  |     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)    
prisma_1  |     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)    
prisma_1  |     at java.lang.Thread.run(Thread.java:748)
prisma_1  |
prisma_1  | Exception in thread "main" org.postgresql.util.PSQLException: FATAL: too many connections 
prisma_1  |     at org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2566)prisma_1  |     at org.postgresql.core.v3.QueryExecutorImpl.<init>(QueryExecutorImpl.java:131)prisma_1  |     at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:210)
prisma_1  |     at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)prisma_1  |     at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195)
prisma_1  |     at org.postgresql.Driver.makeConnection(Driver.java:452)
prisma_1  |     at org.postgresql.Driver.connect(Driver.java:254)prisma_1  |     at slick.jdbc.DriverDataSource.getConnection(DriverDataSource.scala:101)
prisma_1  |     at slick.jdbc.DataSourceJdbcDataSource.createConnection(JdbcDataSource.scala:68)
prisma_1  |     at slick.jdbc.JdbcBackend$BaseSession.<init>(JdbcBackend.scala:453)
prisma_1  |     at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:46)
prisma_1  |     at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:37)
prisma_1  |     at slick.basic.BasicBackend$DatabaseDef.acquireSession(BasicBackend.scala:249)
prisma_1  |     at slick.basic.BasicBackend$DatabaseDef.acquireSession$(BasicBackend.scala:248)
prisma_1  |     at slick.jdbc.JdbcBackend$DatabaseDef.acquireSession(JdbcBackend.scala:37)
prisma_1  |     at slick.basic.BasicBackend$DatabaseDef$$anon$2.run(BasicBackend.scala:274)
prisma_1  |     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
prisma_1  |     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
prisma_1  |     at java.lang.Thread.run(Thread.java:748)
prisma_prisma_1 exited with code 1

Ошибка говорит слишком много подключений , но я запускаю prisma deploy только с одного терминала, и в то же время я могу подключиться к базе данных, используя PgAdmin4. Более того, база данных кажется вполне достижимой, поскольку я могу пропинговать базу данных изнутри контейнера.

PS. Обновлены журналы докера, как и раньше, при запуске docker logs -f processid Я получал старые журналы, но теперь, после построения контейнера снова, используя docker-compose up, я получил последние журналы

1 Ответ

0 голосов
/ 16 июля 2019

Как ясно указывает на ошибку, слишком много подключений к базе данных.Поэтому нам нужно выяснить, сколько существует связей, кто их создает и почему они создаются.Чтобы либо ограничить потребителей, либо увеличить количество доступных подключений.

Сначала мы можем использовать CLI heroku для проверки количества использованных и доступных подключений:

$ heroku pg:info

=== DATABASE_URL
Plan:                  Private 2
Status:                Available
HA Status:             Available
Data Size:             2.23 GB
Tables:                83
PG Version:            10.1
Connections:           26/400
Connection Pooling:    Available

ДляБолее подробную информацию о том, как исследовать базы данных heroku postgres, смотрите: https://devcenter.heroku.com/articles/heroku-postgresql#pg-info

Для дальнейшего изучения того, кто подключен к вашей базе данных, вы можете использовать psql или pgAdmin.Если вы используете pgAdmin, вы можете выбрать базу данных, щелкнуть вкладку «Панель инструментов» и выбрать панель активности сервера в нижней части страницы, где отображаются все подключенные сеансы.Если вы используете psql, вы можете написать следующее:

SELECT pid as process_id, 
       usename as username, 
       datname as database_name, 
       client_addr as client_address, 
       application_name,
       backend_start,
       state,
  FROM pg_stat_activity;

Более подробно о том, как посмотреть: https://dataedo.com/kb/query/postgresql/list-database-sessions

К настоящему времени вы, вероятно, определили, кто создает соединения с вашей базой данных.и может ограничить использование клиентом меньше (или увеличить количество доступных подключений к базе данных).

Конечно, одним из возможных потребителей соединений с базой данных является сам сервер prisma.К счастью, конфигурация prisma предоставляет параметр для ограничения соединений с базой данных.

Свойство connectionLimit в PRISMA_CONFIG определяет количество соединений с базой данных, которые будет использовать служба Prisma.

Подробнее об этом можно прочитать здесь: https://www.prisma.io/docs/prisma-server/database-connector-POSTGRES-jgfr/#managing-database-connections

Если вы используете heroku для запуска док-контейнера с вашим сервером prisma, PRISMA_CONFIG может выглядеть так:

port: $PORT
managementApiSecret: ${PRISMA_MANAGEMENT_API_SECRET}
databases:
  default:
    connector: postgres
    migrations: true
    connectionLimit: 2
    uri: ${DATABASE_URL}?ssl=1  

Надеюсь, этот структурированный подход помог.Дайте мне знать, если вам нужно больше разъяснений.Если это так, просьба сообщить подробности о характере существующих подключений к базе данных.

...