Hikari connection pool does not recover from sql error : current transaction is aborted, commands ignored until end of transaction block

Hikari connection pool does not recover from sql error : current transaction is aborted, commands ignored until end of transaction block

我正在使用下面的函数来执行 BEGIN; QUERY 1; QUERY 2; COMMIT

的交易
  def transform(transformFile: String): Unit = {
    val db = PostgresqlHikari.db
    try {
      val dbConfig = ConfigFactory.load().getConfig("db.dwh")
      val schema = dbConfig.getString("schema")
      logger.info("Set connection schema ----> " + schema)

      val query = Source.fromResource("transformation/" + transformFile + ".sql")
        .getLines().mkString(System.lineSeparator())
      val preparedStatement: PreparedStatement = db.prepareStatement(query)
      preparedStatement.execute()
      //db.close()
    } catch {
      case ex: Throwable ⇒
        {
          logger.error(s"Error while processing $transformFile. Detailed error log ---" + ex.toString)
          //db.close()
        }
    }
  }

没有sql错误时,运行正常。但是,如果我遇到错误,演员就会停止处理。 我不断得到的错误是:

  org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block

如果我重新启动该服务,它将再次开始正确处理,直到下一个 query error 发生。

我正在使用 Hikari 连接池。

参与者使用 db 连接来执行事务。现在,如果出现 sql 错误,连接应该 rollback 发生变化。只有 2 条路径可以结束 sql 交易,commitrollback

我在 catch 块中添加了 rollback 逻辑,现在错误不再发生:

  def transform(transformFile: String): Unit = {
    val db = PostgresqlHikari.db
    try {
      val dbConfig = ConfigFactory.load().getConfig("db.dwh")
      val schema = dbConfig.getString("schema")
      logger.info("Set connection schema ----> " + schema)

      val query = Source.fromResource("transformation/" + transformFile + ".sql")
        .getLines().mkString(System.lineSeparator())
      val preparedStatement: PreparedStatement = db.prepareStatement(query)
      preparedStatement.execute()
      //db.close()
    } catch {
      case ex: Throwable ⇒
        {
          logger.error(s"Error while processing $transformFile. Detailed error log ---" + ex.toString)
          //db.close()
          val rollback: PreparedStatement = db.prepareStatement("rollback;")
          rollback.execute()
        }
    }
  }