java - Liquibase Java,变更集不适用

标签 java liquibase

我目前正在为我的实习构建一个项目,自从两天尝试在 Java 中使用 Liquibase 以来,我一直被困住了。一切似乎都是正确的:找到了更改日志文件,正确的 URI、用户名和密码;但是当我运行它时,我的变更集没有得到处理。

我使用此类来管理程序中的 liquibase 操作,例如 rollbackupdateupdateSQLfutureRollbackSQL,给定一个变更日志,最终是一个目标文件。如果源或目标来自远程服务器,我会使用一些 SSH 交互(scp to,scp from)与 JSch 和临时文件(但这不是主题)。

这是我目前拥有的 java 代码,给定 dbuserpasswdrealAction 是前面设置的changelogpathdest是一些数据存储类。

Connection c = null;
Database database = null;
PrintWriter pw = null;
File file = null;
liquibase.Liquibase liquibase = null;
contexts = db+"."+user;
try {
    pw = new PrintWriter(new FileWriter(file));
    // Get connection
    c = SQLManager.getInstance().getConnection(db, user, passwd);
    // Get liquibase connection
    database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(c));
    liquibase = new liquibase.Liquibase(new DatabaseChangeLog(fsource), new FileSystemResourceAccessor(),
            database);
    // Run liquibase action
    switch (realAction) {
        case Constants.LIQUIBASE_ACTION_FUTUREROLLBACKSQL:
            liquibase.futureRollbackSQL(pw);
            break;
        case Constants.LIQUIBASE_ACTION_UPDATESQL:
            liquibase.update(contexts, pw);
            break;
        case Constants.LIQUIBASE_ACTION_UPDATE:
            liquibase.update(contexts);
            if (!c.getAutoCommit())
                c.commit();
            break;
        default:
            throw new OdewipElementRuntimeException(this, "Action not implemented");
    }
    pw.close();
    database.close();
    c.close();
} catch (IOException | SQLException | LiquibaseException e) {
    throw new Exception(e.getMessage());
} finally {
    if (c != null) {
        try {
            c.close();
        } catch (SQLException e) {
            // nothing to do
            throw new RuntimeException(e.getClass() + ": " + e.getMessage());
        }
    }
}

这是我的更新日志:

<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:ora="http://www.liquibase.org/xml/ns/dbchangelog-ext"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd    http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">    

    <changeSet id="mychangeset" author="testy">
        <preConditions onSqlOutput="TEST" onFail="MARK_RAN">
            <not>
                <tableExists tableName="abcd"/>
            </not>
        </preConditions>
        <createTable tableName="abcd">
            <column name="id" type="number">
                <constraints primaryKey="true"/>
            </column>
        </createTable>
    </changeSet>

</databaseChangeLog>

Liquibase 似乎可以做一些事情,除了解析我的变更集。当我启动我的操作时,sql 生成的文件仅包含两个 liquibase 表(databasechangelog 和 databasechangeloglock)的创建,仅此而已。 update 操作根本不会修改任何内容(甚至不会创建前面提到的两个表)。我 (100%) 确定表 abcd 在执行前不存在于数据库中。

所以我认为此时我需要一些帮助,以找出不起作用的地方。我试图查看 liquibase 论坛中的一些示例,但没有任何帮助。 我目前正在使用 Maven 的 liquibase 3.4.0:

<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
    <version>3.4.0</version>
</dependency>

是否还有我遗漏的其他依赖项? 另一个小问题是如何包含一个特殊的 oracle 数据库驱动程序 (ojdbc6.jar)?

感谢您的回答。

编辑 06/08/2015: 我在 Debug模式下获得了日志(故意更改了架构名称):

DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: select count(*) from MYSCHEMA.DATABASECHANGELOGLOCK
DEBUG 06/08/15 09:28: liquibase: Create Database Lock Table
DEBUG 06/08/15 09:28: liquibase: Executing EXECUTE database command: CREATE TABLE MYSCHEMA.DATABASECHANGELOGLOCK (ID NUMBER(10) NOT NULL, LOCKED NUMBER(1) NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR2(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID))
DEBUG 06/08/15 09:28: liquibase: Created database lock table with name: MYSCHEMA.DATABASECHANGELOGLOCK
DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: select count(*) from MYSCHEMA.DATABASECHANGELOGLOCK
DEBUG 06/08/15 09:28: liquibase: Initialize Database Lock Table
DEBUG 06/08/15 09:28: liquibase: Executing EXECUTE database command: DELETE FROM MYSCHEMA.DATABASECHANGELOGLOCK
DEBUG 06/08/15 09:28: liquibase: Executing EXECUTE database command: INSERT INTO MYSCHEMA.DATABASECHANGELOGLOCK (ID, LOCKED) VALUES (1, 0)
DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: SELECT LOCKED FROM MYSCHEMA.DATABASECHANGELOGLOCK WHERE ID=1 FOR UPDATE
DEBUG 06/08/15 09:28: liquibase: Lock Database
DEBUG 06/08/15 09:28: liquibase: Executing UPDATE database command: UPDATE MYSCHEMA.DATABASECHANGELOGLOCK SET LOCKED = 1, LOCKEDBY = 'CRO09177 (xx.xx.xx.xxx)', LOCKGRANTED = to_date('2015-08-06 09:28:28', 'YYYY-MM-DD HH24:MI:SS') WHERE ID = 1 AND LOCKED = 0
INFO 06/08/15 09:28: liquibase: Successfully acquired change log lock
DEBUG 06/08/15 09:28: liquibase: Create Database Change Log Table
INFO 06/08/15 09:28: liquibase: Creating database history table with name: MYSCHEMA.DATABASECHANGELOG
DEBUG 06/08/15 09:28: liquibase: Executing EXECUTE database command: CREATE TABLE MYSCHEMA.DATABASECHANGELOG (ID VARCHAR2(255) NOT NULL, AUTHOR VARCHAR2(255) NOT NULL, FILENAME VARCHAR2(255) NOT NULL, DATEEXECUTED TIMESTAMP NOT NULL, ORDEREXECUTED NUMBER(10) NOT NULL, EXECTYPE VARCHAR2(10) NOT NULL, MD5SUM VARCHAR2(35), DESCRIPTION VARCHAR2(255), COMMENTS VARCHAR2(255), TAG VARCHAR2(255), LIQUIBASE VARCHAR2(20), CONTEXTS VARCHAR2(255), LABELS VARCHAR2(255))
DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: select count(*) from MYSCHEMA.DATABASECHANGELOG
INFO 06/08/15 09:28: liquibase: Reading from MYSCHEMA.DATABASECHANGELOG
DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: SELECT FILENAME,AUTHOR,ID,MD5SUM,DATEEXECUTED,ORDEREXECUTED,EXECTYPE,DESCRIPTION,COMMENTS,TAG,LIQUIBASE,LABELS,CONTEXTS FROM MYSCHEMA.DATABASECHANGELOG ORDER BY DATEEXECUTED ASC, ORDEREXECUTED ASC
DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: select count(*) from MYSCHEMA.DATABASECHANGELOGLOCK
DEBUG 06/08/15 09:28: liquibase: Release Database Lock
DEBUG 06/08/15 09:28: liquibase: Executing UPDATE database command: UPDATE MYSCHEMA.DATABASECHANGELOGLOCK SET LOCKED = 0, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1
INFO 06/08/15 09:28: liquibase: Successfully released change log lock

最佳答案

在 Datical,我们注意到 Liquibase 和 Java 1.8 存在一些问题。您在 Liquibase 用户论坛的帖子中提到您使用的是 Java 1.8,因此 Java 1.8 可能是问题所在。您可以尝试使用 Java 1.7 并查看是否会得到不同的结果吗?如果没有,您可以尝试提高日志记录级别 - 在创建 Liquibase 对象后添加如下一行:

LogFactory.getInstance().getLog().setLogLevel(logLevel);

其中 logLevel 是字符串“debug”

关于java - Liquibase Java,变更集不适用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31814426/

相关文章:

mysql - 当将 liquibase 与 mysql 一起使用时,出现连接关闭后不允许操作错误

java - 修复 JPopupMenu 分隔符 (GTK LaF) 和项目突出显示

java - 功能修改数据库时是否可以使用功能标志/切换?

java - 如何让Eclipse将某个项目文件夹复制到相应的bin目录中?

java - 部署前如何执行java程序

oracle - liquibase 格式的 sql 文件,包含多行回滚语句以允许 Oracle PL/SQL

spring-boot - Liquibase 4.0 中删除了通过绝对路径指定文件

java - 更改 Naturald 参数名称后出错

java - 在 Android 和 OpenGL ES 中将字符串渲染为纹理

java - 从另一个 Spring Boot JPA 项目插入的数据库中读取数据