多くの結合が含まれていてかなり複雑なため、DBMS_MVIEW.REFRESHを(非同期的に)/Hibernateベース)Java Web-Appはこのようになります:アクセス(Oracle)MViewのBeeingリフレッシュ中にJavaからのマテリアライズド・ビュー
this.getEntityManager().createNativeQuery("{call DBMS_MVIEW.REFRESH('AccountManagerView', method => 'C', PARALLELISM => 4)}");
ここまではすべて正常に動作しています。
唯一の問題は、MViewがリフレッシュされている間に、MViewから読み込もうとしている他の発信者がブロックされ、リフレッシュが完了するまで待つことです。
面白いことは、SQLデベロッパーからMViewにアクセスできることです。そこからselectを実行すると、呼び出しは更新が完了するまで待機しません。
私は、(読み取り)呼び出しが、Oracleのデフォルトの分離レベルund read-only = trueの新しいトランザクションで行われていることを確認しました。 は、残念ながらまだブロック...
私はSQL Developerからデータにアクセスすることができるので、Javaのコードから同じことを達成する方法があるはず....
「他の発信者」のサンプルを提供すると、それは素晴らしいことになります。このコードには、SQL Developerで成功したときに他のクライアントからのリフレッシュ中に失効したデータにアクセスできる必要があるため、このコードには固有のものがあります。彼らは何か特定のものを使用するかもしれません.. – g00dy
実際にコードは特別なことをしません。 これは、具体的なDAO実装の汎用スーパークラスを介して名前付きクエリを呼び出す1ライナーです。 選択は(JPQLで) から選択します。AccountManagerCustomerAndInstituteDto aからzipCodeを選択します。(:zipCodes) –
続き: DAOは、デフォルトの分離レベルが設定されたSpring AOP経由のトランザクションを取得します。 前に述べたように、私はトランザクション設定で成功しないで別の設定を試みました。 私はアプリケーションで完全な新しいDataSourceを設定しようとしても、同じ方法で「DataSourceからConnectionを取得し、ステートメントを準備することで」「JDBC-way」を試しました.MViewを待っていますリフレッシュする。 –