首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在prisma部署中获取内部服务器错误

在prisma部署中获取内部服务器错误
EN

Stack Overflow用户
提问于 2019-07-06 15:27:18
回答 3查看 1.1K关注 0票数 5

我在Heroku上有一个Postgres数据库,在通过执行prisma deploy部署数据模型时,经常会产生以下错误。

代码语言:javascript
复制
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
}

在检查码头日志时,我看到这个错误:

代码语言:javascript
复制
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部署,同时能够使用PgAdmin4连接到数据库。此外,数据库似乎是完全可以访问的,因为我能够从容器中平移数据库。

PS.我在运行docker logs -f processid 时更新了日志,但现在再次使用构建容器时,我得到了最新的日志

EN

回答 3

Stack Overflow用户

发布于 2019-07-16 08:44:14

正如错误明确指出的那样,与数据库的连接太多。因此,我们需要调查有多少连接,谁在创建它们,以及它们为什么被创建。以限制使用者或增加可用连接的数量。

首先,我们可以使用heroku检查使用的连接和可用连接的数量:

代码语言:javascript
复制
$ 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,您可以编写如下所示的选择:

代码语言:javascript
复制
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可能如下所示:

代码语言:javascript
复制
port: $PORT
managementApiSecret: ${PRISMA_MANAGEMENT_API_SECRET}
databases:
  default:
    connector: postgres
    migrations: true
    connectionLimit: 2
    uri: ${DATABASE_URL}?ssl=1  

我希望这种结构化的做法有所帮助。如果你需要更多的澄清,请告诉我。如果是,请详细说明现有数据库连接的性质。

票数 0
EN

Stack Overflow用户

发布于 2020-06-03 13:13:41

运行此命令

代码语言:javascript
复制
docker logs <YOUR_PRISMA_CONTAINER_NAME>
票数 0
EN

Stack Overflow用户

发布于 2022-09-12 19:54:29

使用池:

代码语言:javascript
复制
import dotenv from 'dotenv' 
dotenv.config()
import { PrismaClient } from '@prisma/client'

// add prisma to the NodeJS global type
interface CustomNodeJsGlobal extends NodeJS.Global {
  prisma: PrismaClient
}

// Prevent multiple instances of Prisma Client in development
declare const global: CustomNodeJsGlobal

const prisma = global.prisma || new PrismaClient()


if (process.env.NODE_ENV === 'development') global.prisma = prisma

export default prisma

加上使用:

代码语言:javascript
复制
await prisma.$disconnect()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56915434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档