scala - 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 连接池。
解决方案
参与者使用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()
}
}
}
推荐阅读
- excel - 我作为月度订阅者运行 Excel 2019。我的 F 键都没有做你们说他们应该做的事!建议?
- php - 来自 mobile.de 的 SimpleXMLElement 和 XML 数据的问题
- aix - AIX :- 在基于 Clang 的前端中调用共享库函数时出现分段错误
- android - .FBX 中的多个 3D 对象 - 如何对每个对象应用不同的纹理
- java - 如何从字符串中提取所有整数并将其转换为 Java 中指定的 char 值?
- python - Celery:发送任务时忽略交换名称
- android - 不记名令牌请求http颤动
- graphql - graphql 对所有或少数模式字段的单选查询
- android - 从 TextInputEditText 中删除底线
- html - 如何防止浏览器在移动视口中加载图像