gpt4 book ai didi

java - 在 Java 内部,Liquibase 更新在应用变更集后挂起

转载 作者:行者123 更新时间:2023-12-02 06:34:52 29 4
gpt4 key购买 nike

我正在使用 Liquibase 运行单元测试迁移。我使用一个名为 ${projectName}Liquibase.java 的类来存储两个静态函数

public class ${projectName}Liquibase {
...
public static void runMigrations(Connection conn, DB_TYPE dbType) {
Liquibase liquibase;
Database database = null;
try {
database = DatabaseFactory.getInstance()
.findCorrectDatabaseImplementation(new JdbcConnection(conn));
liquibase = new Liquibase(dbType.filePath, new FileSystemResourceAccessor(), database);
liquibase.validate();
liquibase.update(null);
} catch (LiquibaseException e) {
throw new RuntimeException("File at " + dbType.filePath + " Error: " + e.getMessage());
}
}
public static void dropTables() {
...
}
}

我使用 System.getProperty("user.dir") 和路径的其余部分获取文件 dbType.filePath 参数。

文件读取良好,但是更新仅遍历第一个变更集,然后在测试期间挂起。因此,测试不会运行。

测试已从我的 Intellij 项目中的其他文件和子模块成功运行。特别是,我们的集成测试套件使用不同子模块的相同接口(interface)成功运行。所有测试都会通过,直到这个:

Running *.*.*.*.*.*DAOTest
2013-11-03 14:59:53,144 DEBUG [main] c.j.bonecp.BoneCPDataSource : JDBC URL = jdbc:hsqldb:mem:*, Username = SA, partitions = 2, max (per partition) = 5, min (per partition) = 5, helper threads = 3, idle max age = 60 min, idle test period = 240 min
INFO 11/3/13 2:59 PM:liquibase: Reading from PUBLIC.DATABASECHANGELOG
INFO 11/3/13 2:59 PM:liquibase: Successfully acquired change log lock
INFO 11/3/13 2:59 PM:liquibase: Reading from PUBLIC.DATABASECHANGELOG
INFO 11/3/13 2:59 PM:liquibase: /Users/davidgroff/repo/services/${projectName}/server/../core/src/main/java/com/*/*/liquibase/hsqldb.sql: 1::davidgroff: Custom SQL executed
INFO 11/3/13 2:59 PM:liquibase: /Users/davidgroff/repo/services/${projectName}/server/../core/src/main/java/com/*/*/liquibase/hsqldb.sql: 1::davidgroff: ChangeSet /Users/davidgroff/repo/services/*/*/../core/src/main/java/com/*/*/liquibase/hsqldb.sql::1::davidgroff ran successfully in 3ms
INFO 11/3/13 2:59 PM:liquibase: Successfully released change log lock

此后,测试会反复挂起,就像在某个无限循环中一样。

我当前的设置:

      <dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>3.0.6</version>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.0.6</version>
</dependency>

我在 Maven 3.1.0 上使用 Java 7。

最佳答案

可能有一个单独的事务已锁定数据库中的一行,并且 Liquibase 正在挂起等待另一个事务完成。

您说“更新仅执行第一个变更集,然后在测试期间挂起”,这是否意味着第一个变更集成功运行?如果是这种情况,则锁定的记录要么是 DATABASECHANGELOG 表上的表锁,导致 INSERT INTO DATABASECHANGELOG 无法完成,要么是第二个变更集出现问题。

假设这是 DATABASECHANGELOG 表的问题,是否有单独的线程或进程试图从该表中删除?

关于java - 在 Java 内部,Liquibase 更新在应用变更集后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19757650/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com