[英]From within Java, Liquibase update is hanging after applying a changeset
我正在使用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。
可能是一個單獨的事務已鎖定數據庫中的一行,而Liquibase掛起以等待其他事務完成。
您說“更新僅通過第一個變更集,然后在測試期間掛起”,這是否意味着第一個changeSet成功運行? 如果是這種情況,則鎖定的記錄要么是DATABASECHANGELOG表上的表鎖,它阻止了INSERT INTO DATABASECHANGELOG的完成,要么是您的第二個changeSet有問題。
假設DATABASECHANGELOG表存在問題,是否有單獨的線程或進程一直試圖從該表中刪除?
原來的問題是,在使用以下命令應用了liquibase變更集之后,正在創建並使用連接,
connection.createStatement(..."***SQL***"...);
並且從未被提交到數據庫,因為創建了新連接或該連接已用完數據。 為什么這在我們使用Liquibase運行遷移之前起作用的原因還是一個謎。 解決方法是通過調用以下命令來提交上述語句:
connection.commit();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.