【问题标题】:PSQLException: FATAL: sorry, too many clients already Akka HTTPPSQLException: FATAL: 抱歉,已经有太多客户端 Akka HTTP
【发布时间】:2018-06-20 18:01:56
【问题描述】:

我有一个应用程序连接到 PostgreSQL 数据库、API 和 Akka 流使用来使用 Twitter4J 提取推文。提取的推文被写入数据库,然后使用 Slick 进行查询。使用 Akka HTTP,我创建了一个 API 来向 db 发送查询。所以我的问题是,经过几次请求后,我得到了这个错误:

我不确定问题出在哪里以及为什么会发生,因为我正在完成关闭 Actor 系统。

object Main extends ApiRoute {

  def main(args: Array[String]): Unit = {
    implicit val system = ActorSystem()
    implicit val materializer = ActorMaterializer()
    implicit val executionContext = system.dispatcher
    val twitterStream = TwitterStreamFilters.configureTwitterStream()
    val counter = new Counter
    twitterStream.addListener(counter)
    val bindingFuture = Http().bindAndHandle(routes, "localhost", 8080)
    println("Server started!")
    StdIn.readLine()
    bindingFuture
      .flatMap(_.unbind())
      .onComplete(_ => system.terminate())
  } 

还有application.conf文件:

scalaxdb = {
  dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
  properties = {
    driver = "org.postgresql.Driver"
    url = "jdbc:postgresql://localhost/twitter2.0?user=user&password=password"
  }
}

如果有任何帮助,我将不胜感激!

【问题讨论】:

  • postgresql.conf 中的max_connections 设置为什么?或者直接查询 Postgres(在该集群中的任何数据库中),select current_setting('max_connections');
  • 设置为500个连接
  • 根据经验(取决于 CPU 内核、内存和预期的并发性),如果您的应用程序要执行 > 100 个并发连接,您应该调查连接池。众所周知,pgbouncer 在负载下表现良好(最初是在 Skype 开发的,如果没记错的话)。

标签: postgresql scala akka-stream akka-http


【解决方案1】:

你能试试下面的配置吗?

scalaxdb = {
  dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
  properties = {
    driver = "org.postgresql.Driver"
    url = "jdbc:postgresql://localhost/twitter2.0?user=user&password=password"
  }
  numThreads = 10
}

所以对于 numThreads,我将连接数限制为 10。

您还应该显示与数据库进行通信的代码?

【讨论】: