簡體   English   中英

在Java中,應用更改集后,Liquibase更新被掛起

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM