服务器运行集成测试访问数据库视图报错本地PC正常问题咨询
集成测试服务器环境频繁报“视图不存在”问题排查
问题现象
运行集成测试时,测试执行前会创建对应数据库结构并填充测试数据,后续业务方法通过JDBC访问数据库视图获取数据。在服务器上执行构建流程运行集成测试时,频繁出现*“视图不存在”*的报错,但相同代码在本地PC环境运行时完全不会复现。
技术栈
- Java 8
- Postgres 13
- Spring 5
测试代码示例
@Sql( scripts = { "drop-shema.sql", "create-schema.sql", "create-tables.sql", "add-constraints.sql", "create-view.sql", "inser-data.sql" }, config = @SqlConfig(transactionMode = TransactionMode.ISOLATED)) @Test public void foo() { List<Bar> bars = selectBarDao.exec(); ... }
已排除的诱因
- 并行执行触发问题
最初怀疑服务器CPU核心数多于本地PC,并行执行导致冲突,已完成三项验证均未解决问题:- 为
@Sql注解添加config = @SqlConfig(transactionMode = TransactionMode.ISOLATED)参数 - 在测试类上添加
@Transaction注解,确保当前测试内独立完成数据库结构清理与全量创建,其他测试的并行执行因处于独立事务不会产生干扰 - 禁用测试的多线程运行模式
- 为
@Sql注解未抛出脚本执行错误(如视图创建失败异常)
验证方式:移除@Sql配置中用于清理结构的脚本,本地PC运行时可正常捕获对应错误,排除该可能。- 同一
@Sql注解内的脚本执行顺序错乱
验证方式:将多个脚本文件合并为单个文件执行,问题仍复现,排除该可能。
高概率根因与排查方向
- 数据源连接的search_path配置不一致
服务器环境的测试数据源连接Postgres时,默认search_path未包含视图创建所在的schema,JDBC访问时默认仅检索public schema,自然无法找到目标视图;本地环境连接参数中配置了正确的schema路径,因此不会触发问题。可直接在create-view.sql中为视图写全schema限定名(如CREATE VIEW <业务schema名>.<视图名> AS ...),DAO层查询时也带上schema前缀,或在测试数据源的JDBC URL中追加?currentSchema=<业务schema名>强制指定连接默认schema,验证问题是否消失。 - DDL事务提交时序问题
配置的ISOLATED事务模式下,Spring会为SQL脚本执行单独开启事务,若服务器端连接池配置为脚本执行后未等事务提交就将连接放回池,业务DAO拿到的是全新连接,无法读取到未提交的视图创建DDL——Postgres的DDL支持事务,但未提交的DDL对其他连接不可见。本地环境可能因连接池最小空闲连接数为1,每次拿到的都是同一连接,因此不会暴露问题。可给@SqlConfig追加commitOnExecution = true配置,让每个脚本执行完成后立刻提交事务,验证是否解决。 - 标识符匹配规则不一致
检查create-view.sql中的视图名是否使用双引号包裹导致大小写强制匹配,例如脚本中写CREATE VIEW "BarView" AS ...,DAO查询时使用的是无引号的barview,本地Postgres可能未开启严格标识符校验,服务器端Postgres配置了严格的大小写匹配规则,就会抛出视图不存在错误。 - DDL执行锁等待超时问题
若drop-schema.sql中使用DROP SCHEMA IF EXISTS <schema名>语句但未加CASCADE参数,服务器磁盘IO性能弱于本地时,删除schema的操作未完成释放锁,后续创建视图的语句就会因锁等待超时静默失败,后续访问时自然找不到视图。可在drop schema语句末尾追加CASCADE,同时为每个测试类分配独立的临时schema,执行完成后自动删除,避免多测试共用schema产生的时序冲突。 - 服务器构建时资源加载异常
若服务器通过CI/CD流水线执行构建,可能存在资源文件过滤规则配置错误,导致create-view.sql被截断、编码错误,视图创建语句实际未被正确执行。之前仅在本地验证了脚本错误抛出逻辑,未覆盖服务器环境的资源加载场景。可在测试方法执行前插入一段JDBC逻辑,直接查询information_schema.views系统表,确认当前连接下是否能查询到目标视图、视图所属schema是否符合预期,快速定位视图是否真的创建成功。
内容的提问来源于stack exchange,提问作者GreenFed
相关产品推荐
相关产品推荐

