我有一个MView,因为它确实涉及许多联接并且非常复杂,所以可以通过从(基于Spring / Hibernate的)Java Web App异步调用DBMS_MVIEW.REFRESH来按需刷新,如下所示:

this.getEntityManager().createNativeQuery("{call DBMS_MVIEW.REFRESH('AccountManagerView', method => 'C', PARALLELISM => 4)}");


到目前为止,一切正常。

我唯一的问题是,当刷新MView时,其他尝试从MView读取的调用者将被阻止,从而等待刷新完成。

有趣的是,我可以从SQL开发人员访问MView。如果我从那里进行选择,则呼叫不会等待刷新完成。

我确保使用Oracle的默认隔离级别und read-only = true在新的Transaction中完成(读取)调用。
不幸的是它仍然会阻塞...

由于我可以从SQL Developer访问数据,因此应该有一种方法可以通过Java代码实现相同的目的。

最佳答案

Oracle 12g为物化视图引入了新的刷新选项

out_of_place=>true

使用此选项,oracle将在后台建立一个具有新数据的完整新表,并在完成后将MView的“指针”切换到该表并删除旧表。

如果在刷新视图时使用此选项,则Java代码可以访问旧视图中的(可能是旧的)数据,这是所需的行为。

因此,这个很酷的新参数(对我来说是新的)解决了我的问题!

关于java - 在刷新MView时从Java访问(Oracle)物化 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43934256/

10-12 04:05