首页 > 解决方案 > Hikari 连接池无法从 sql 错误中恢复:当前事务被中止,命令被忽略,直到事务块结束

问题描述

我正在使用以下函数来执行 for 的事务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错误时,它运行良好。但是,如果我遇到错误,actor 就会停止处理。我不断得到的错误是:

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

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

我正在使用 Hikari 连接池。

标签: scalahikaricp

解决方案


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

我在我的 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()
        }
    }
  }

推荐阅读