我的应用程序使用WAS 7和Oracle 11g。我期待在部署期间实现零停机。部署涉及对WAS的EAR部署以及对Oracle DB的DDL / DML更改。这个问题的重点是在DDL / DML升级期间Oracle DB没有停机时间,并且支持Java EE应用程序中的新数据定义。
此处的团队之一已使用每个表的Oracle编辑视图(基于版本的修订版)层实现此目的。但是我的应用程序使用JPA和Hibernate。我已经进行了一个小型PoC来创建用于编辑视图的实体;但似乎JPA或Hibernate不支持它们。
是否有任何关于在JPA或Hibernate中使用版本视图的信息?
答案 0 :(得分:0)
我建议您查看Liquibase,这将允许应用程序保持自己的数据库更新。
如果你使用弹簧很容易,你只需要一个如下的弹簧豆:
@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>
每次申请开始时,都会检查是否有任何需要申请的变更。
答案 1 :(得分:0)
一种方法是使用分区表作为主数据表,使用临时表进行更改。您可以使用以下命令对登台表进行更改,然后进行交换:
ALTER TABLE main_table
EXCHANGE PARTITION main_table_1001 WITH TABLE staging_table
WITHOUT VALIDATION
UPDATE GLOBAL INDEXES;
这样,您的客户端(即java web app)甚至不会注意到后端发生的变化。