gpt4 book ai didi

java - 在刷新 MView 时从 Java 访问 (Oracle) 物化 View

转载 作者:行者123 更新时间:2023-12-02 13:11:43 25 4
gpt4 key购买 nike

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

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

到目前为止一切都工作正常。

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

有趣的是,我可以从 SQL Developer 访问 MView。如果我从那里进行选择,则调用不会等待刷新完成。

我确保(读取)调用是在 Oracle 的默认隔离级别和只读 = true 的新事务中完成的。不幸的是它仍然阻塞...

既然我可以从 SQL Developer 访问数据,那么应该有一种方法可以从 Java 代码中实现相同的目的......

最佳答案

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

out_of_place=>true

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com