簡體   English   中英

Slick 3的會話配置/超時

[英]Session Configuration/Timeout with Slick 3

有沒有一種方法可以在Slick 3中顯式處理會話? 我目前有一些看起來像的代碼

def findUserByEmail(email: String): Option[User] = {

    val users = TableQuery[Users]
    val action = users.filter(_.email === email).result.headOption

    val result = db.run(action.transactionally)

    Await.result(result, Duration.Inf)
}

在運行它的前幾次它運行良好,但是隨后我開始遇到一些問題,看起來連接/會話處於打開狀態(請參見下文)。 這段代碼在aws lambda函數內部運行,我想我需要更明確地處理會話。 我將如何在Slick 3中做到這一點?

"errorMessage": "Timeout after 5000ms of waiting for a connection.",
    "errorType": "java.sql.SQLTimeoutException",
    "stackTrace": [
      "com.zaxxer.hikari.pool.BaseHikariPool.getConnection(BaseHikariPool.java:233)",
      "com.zaxxer.hikari.pool.BaseHikariPool.getConnection(BaseHikariPool.java:183)",
      "com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:93)",
      "slick.jdbc.hikaricp.HikariCPJdbcDataSource.createConnection(HikariCPJdbcDataSource.scala:18)",
      "slick.jdbc.JdbcBackend$BaseSession.<init>(JdbcBackend.scala:424)",
      "slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:47)",
      "slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:38)",
      "slick.basic.BasicBackend$DatabaseDef.acquireSession(BasicBackend.scala:218)",
      "slick.basic.BasicBackend$DatabaseDef.acquireSession$(BasicBackend.scala:217)",
      "slick.jdbc.JdbcBackend$DatabaseDef.acquireSession(JdbcBackend.scala:38)",
      "slick.basic.BasicBackend$DatabaseDef$$anon$2.run(BasicBackend.scala:239)",
      "java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)",
      "java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)",
      "java.lang.Thread.run(Thread.java:745)"
    ],
    "cause": {
      "errorMessage": "FATAL: remaining connection slots are reserved for non-replication superuser connections",
      "errorType": "org.postgresql.util.PSQLException",
      "stackTrace": [
        "org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2455)",
        "org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2586)",
        "org.postgresql.core.v3.QueryExecutorImpl.<init>(QueryExecutorImpl.java:113)",
        "org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:222)",
        "org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:52)",
        "org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:216)",
        "org.postgresql.Driver.makeConnection(Driver.java:404)",
        "org.postgresql.Driver.connect(Driver.java:272)",

您可以嘗試設置查詢超時。 像這樣:

db.run(action.transactionally.withStatementParameters(statementInit = st => st.setQueryTimeout(100)))

您還可以在Hikari連接池上設置不同的屬性,如下所示:

slick {
      // https://github.com/slick/slick/blob/master/slick-hikaricp/src/main/scala/slick/jdbc/hikaricp/HikariCPJdbcDataSource.scala
      dataSourceClass = "slick.jdbc.DriverDataSource"
      user = ${database.user}
      password = ${database.password}
      url = ${database.url}
      connectionPool = HikariCP
      maxConnections = 50
      numThreads = 10
      queueSize = 5000
      connectionInitSql = "SELECT 1;"
      connectionTestQuery = "SELECT 1;"
      registerMbeans = true

      properties = {
        driver = ${database.driver}
        url = ${database.url}
      }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM