Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MView刷新时从Java访问(Oracle)物化视图_Java_Spring_Oracle_Jdbc - Fatal编程技术网

MView刷新时从Java访问(Oracle)物化视图

MView刷新时从Java访问(Oracle)物化视图,java,spring,oracle,jdbc,Java,Spring,Oracle,Jdbc,我有一个MView,因为它确实涉及许多连接,而且非常复杂,通过从基于Spring/Hibernate的Java Web应用程序异步调用DBMS_MView.REFRESH,可以根据需要进行刷新,如下所示: this.getEntityManager().createNativeQuery("{call DBMS_MVIEW.REFRESH('AccountManagerView', method => 'C', PARALLELISM => 4)}"); 到目前为止,一切正常 我唯

我有一个MView,因为它确实涉及许多连接,而且非常复杂,通过从基于Spring/Hibernate的Java Web应用程序异步调用DBMS_MView.REFRESH,可以根据需要进行刷新,如下所示:

this.getEntityManager().createNativeQuery("{call DBMS_MVIEW.REFRESH('AccountManagerView', method => 'C', PARALLELISM => 4)}");
到目前为止,一切正常

我唯一的问题是,当MView刷新时,其他试图从MView读取的调用方被阻止,因此等待刷新完成

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

我确保读取调用是在Oracle默认隔离级别为und read-only=true的新事务中完成的。 不幸的是,它仍然阻止


因为我可以从SQL Developer访问数据,所以应该有一种方法可以从Java代码中实现相同的功能。…

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

位置外=>true

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

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


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

如果你能提供其他来电者的样本,那就太好了。这段代码中有一些特定的内容,因为当您成功使用SQL Developer时,您应该能够在刷新期间从其他客户端访问过时的数据。可能他们使用了一些特定的东西。实际上,代码没有做任何特殊的事情。它只是通过具体DAO实现的泛型超类调用命名查询的一行程序。选择在JPQL中,从AccountManagerCustomerAndInstituted选择一个事务,其中zipcodein:zipcodecont'd:DAO通过Spring AOP获取一个事务,该事务设置了默认隔离级别。如前所述,我尝试了不同的事务配置设置,但没有成功。我甚至尝试在应用程序中设置一个全新的数据源,并尝试使用JDBC方式,从数据源获取连接,准备一条语句…-同样的结果是:它等待MView被刷新。在我看来,问题出在EntityManager中。在此处检查此错误/增强请求->。在这里也检查一下这个。我认为EntityManager实际上为其他用户锁定了它,因为他们很可能使用相同的方法,例如this.getEntityManager.createNativeQuery。。。。MView应该可以在标准Oracle环境中访问,这就是为什么您可以从SQL Developer中进行选择。我建议从数据库中进行定时刷新,以解决此死锁问题。如果不可能,那么我建议Web应用程序不要直接调用刷新,而是调用另一个pl/sql过程,该过程将在线程或dbms_调度程序作业中完成。