2016-11-10 78 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应用程序)甚至不会注意到的变化在后台发生。