【问题标题】:PostgreSQL "forgets" default schema when closing data source connectionPostgreSQL 在关闭数据源连接时“忘记”默认模式
【发布时间】:2021-09-24 16:59:56
【问题描述】:

我在使用 Spring Boot 和 Spring Data 时遇到了一个非常奇怪的问题:在我手动关闭连接后,以前工作的应用程序似乎“忘记”了它正在使用的架构并抱怨缺少关系。

这是有问题的代码 sn-p:

try (Connection connection = this.dataSource.getConnection()) {
  ScriptUtils.executeSqlScript(connection, new ClassPathResource("/script.sql"));
}

此代码运行良好,但在执行后,应用程序立即开始抛出如下错误:

org.postgresql.util.PSQLException: ERROR: relation "some_table" does not exist

在执行上面的代码之前,应用程序工作正常(包括引用它后来抱怨的表)。如果我删除了 try-resource 块,并且不关闭连接,那么一切正常,除了我现在创建了资源泄漏。我还尝试通过以下方式明确设置默认架构(公共):

  • 在带有 currentSchema 参数的 JDBC URL 中
  • 使用spring.datasource.hikari.schema 参数
  • 使用spring.datasource.jpa.properties.hibernate.default_schema 属性

最后一个确实缓解了与 Hibernate 托管类有关的问题,但本机查询仍然存在该问题。当然,我可以在这些查询中明确表示模式,但这似乎并没有解决根本问题。为什么关闭连接会触发这种行为?

我的环境:

  • Spring Boot 2.5.1
  • PostgreSQL 12.7

【问题讨论】:

  • 那个脚本里有什么?它会改变默认搜索路径吗?您要使用的架构是否实际出现在您的默认搜索路径上?请提供minimal reproducible example
  • 您正在使用的用户的search_path 是什么?听起来好像从默认值改变了。可以通过alter user set search_path = ...永久设置

标签: postgresql spring-boot spring-data-jpa


【解决方案1】:

感谢上面的几位用户,他们立即看到了我没有看到的内容。该脚本改编自较旧的 pg_dump 运行,确实与 search_path 混为一谈:

SELECT pg_catalog.set_config('search_path', '', false);

删除该行以及其他一些不必要的行解决了问题。对我来说太棒了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    相关资源
    最近更新 更多