2015-08-04 6 views
2

В настоящее время я создаю проект для своей стажировки, и я застрял с двух дней, пытаясь использовать Liquibase в java. Все кажется правильным: найден файл изменений, правильный URI, имя пользователя и пароль; но когда я его запускаю, мои изменения не обрабатываются.Liquibase Java, изменения не применяются

Я использую этот класс для управления LiquiBase действия из моей программы, такие как откат, обновления, UpdateSQL и futureRollbackSQL, данный список изменений и в конечном итоге в файл назначение. Если источник или получатель находится с удаленного сервера, я использую некоторые SSH-взаимодействия (scp to, scp from) с JSch и временными файлами (но это не тема).

Это код Java у меня есть на данный момент, учитывая дб, пользователь, PASSWD, realAction установлены ранее, changelogpath и Dest некоторые класс хранения данных.

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), и все. Обновление ничего не изменит (даже не создав две ранее упомянутые таблицы). Я (100%) уверен, что таблица abcd не существует в базе данных до ее выполнения.

Так что, я думаю, мне нужна помощь на этом этапе, чтобы выяснить, что не работает. Я попытался взглянуть на некоторые примеры из форума Liquibase, но ничего не помогло. настоящее время я использую LiquiBase Maven в 3.4.0:

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

есть другая зависимость включить я пропустил? Еще один вопрос: как включить специальный драйвер базы данных oracle (ojdbc6.jar)?

Благодарим за ответы.

EDIT 06/08/2015: Я получил журналы в режиме отладки (намеренно изменил название схемы):

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 

ответ

2

Здесь на Datical мы заметили, что есть некоторые проблемы с LiquiBase и Java 1.8. Вы упомянули на своем посту на форумах пользователей Liquibase, что вы используете Java 1.8, поэтому возможно, что проблема Java 1.8 может быть проблемой. Можете ли вы попробовать использовать Java 1.7 и посмотреть, есть ли у вас разные результаты?Если нет, то вы могли бы попытаться увеличить уровень журналирования - добавить строку, как это после того, как вы создали свой LiquiBase объект:

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

Где LOGLEVEL является строка «отладки»

+0

Добавлен журнал отладки. – Sylordis

+0

Я бы запустил это в отладчике и посмотрел, действительно ли журнал изменений загружается должным образом. Строка, в которой вы создаете объект Liquibase, передавая «новый DatabaseChangeLog (fsource)» - извлекаете эту локальную переменную и проверяете ее в отладчике. – SteveDonie

+0

DBChangelog кажется правильно созданным, когда выводится он возвращает мне путь моего журнала изменений. В качестве меры предосторожности я даже создал новый экземпляр File с возвращенным путем и вызвал exists(), который вернул true. – Sylordis

1

Скорее всего, это проблема с XML версии.

Заменить в XML заголовке

http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd

в

http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd

+0

Скорее всего, нет. Файлы Xsd находятся здесь, чтобы проверить xml. Сменив его на 3.4 (я протестировал его, на всякий случай), не что-нибудь изменить. – Sylordis

Смежные вопросы