【发布时间】: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