我有一个MView,因为它确实涉及许多连接并且非常复杂,所以通过从(基于Spring- / Hibernate的)Java Web-App调用DBMS_MVIEW.REFRESH(异步)来按需刷新:< / p>
this.getEntityManager().createNativeQuery("{call DBMS_MVIEW.REFRESH('AccountManagerView', method => 'C', PARALLELISM => 4)}");
到目前为止一切正常。
我唯一的问题是,当MView正在刷新时,其他试图从MView读取的调用者被阻止,因此等待刷新完成。
有趣的是,我可以从SQL开发人员访问MView。如果我从那里进行选择,则呼叫不会等待刷新完成。
我确保(读取)调用是在使用Oracle的默认隔离级别和read-only = true的新事务中完成的。 不幸的是它仍然阻止......
由于我可以从SQL Developer访问数据,因此应该有一种方法可以从Java代码中实现相同的目标....
答案 0 :(得分:0)
Oracle 12g为物化视图引入了一个新的刷新选项
out_of_place=>true
使用此选项oracle在后台构建一个包含新数据的完整新表,并在完成后将MView的“指针”切换到此表并删除旧表。
如果我在刷新视图时使用此选项,则我的Java代码可以访问旧视图中的(可能是旧的)数据,这是所需的行为。
所以这个很酷的新参数(对我来说是新的)解决了我的问题!