我正在使用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项目中的其他文件和子模块成功运行测试。特别是,我们的集成测试套件使用来自不同子模块的相同接口成功运行。所有测试都将在此之前完成:
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.
答案 0 :(得分:1)
可能是单独的事务已在您的数据库中锁定了一行,并且Liquibase正在等待另一个事务完成。
你说“更新只通过第一个变更集,然后在测试期间挂起”,这是否意味着第一个changeSet成功运行?如果是这种情况,则锁定的记录是DATABASECHANGELOG表上的表锁定,它阻止INSERT INTO DATABASECHANGELOG完成或第二个changeSet出现问题。
假设DATABASECHANGELOG表存在问题,是否有一个单独的线程或进程尝试从该表中删除?
答案 1 :(得分:0)
问题是,在使用命令应用liquibase变更集后,正在创建和使用连接,
connection.createStatement(..."***SQL***"...);
并且从未被提交到数据库,因为创建了新连接或该连接没有数据。在我们使用Liquibase运行迁移之前,这是有效的。修复只是通过调用:
来提交上述语句connection.commit();