2016-11-10 79 views
0

我的應用程序使用WAS 7和Oracle 11g。我期待在部署期間實現零宕機。部署涉及EAR部署到Oracle DB的WAS和DDL/DML更改。這個問題重點關注在DDL/DML升級期間Oracle DB沒有停機時間,並支持Java EE應用程序中的新數據定義。Oracle版本視圖和JPA或休眠

這裏的一個團隊已經爲每個表使用Oracle版本視圖(基於版本的版本)實現了這一點。但是我的應用程序使用JPA和Hibernate。我已經進行了一個小PoC來創建用於編輯視圖的實體;不過看起來JPA或Hibernate不支持它們。

有關於使用JPA或Hibernate使用版本視圖的任何信息嗎?

回答

0

我建議你看看Liquibase這將允許應用程序保持自己的數據庫最新。

如果您使用的春天,它很容易,你只需要一個Spring bean,如:

@Bean 
public SpringLiquibase liquibase() { 
    log.debug("Configuring Liquibase"); 
    SpringLiquibase liquibase = new SpringLiquibase(); 
    liquibase.setDataSource(dataSource()); 
    liquibase.setChangeLog("classpath:config/liquibase/master.xml"); 
    liquibase.setContexts("development, production"); 
    return liquibase; 
} 

然後,你必須修改日誌:

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

    <changeSet id="1" author="bob"> 
     <createTable tableName="department"> 
      <column name="id" type="int"> 
       <constraints primaryKey="true" nullable="false"/> 
      </column> 
      <column name="name" type="varchar(50)"> 
       <constraints nullable="false"/> 
      </column> 
      <column name="active" type="boolean" defaultValueBoolean="true"/> 
     </createTable> 
    </changeSet> 

</databaseChangeLog> 

每個應用程序啓動時,它會檢查,如果時間有任何需要應用的更改。

+0

感謝您的建議。我從來沒有嘗試過Liquibase。將做一些PoC,看看它是如何幫助。 – ak2205

0

一種方法是使用主數據表的分區表和更改的臨時表。您所做的更改臨時表,然後使用交換:

ALTER TABLE main_table 
EXCHANGE PARTITION main_table_1001 WITH TABLE staging_table 
WITHOUT VALIDATION 
UPDATE GLOBAL INDEXES; 

這樣,你的客戶(即Java的Web應用程序)甚至不會注意到的變化在後臺發生。