2017-05-12 26 views
0

多くの結合が含まれていてかなり複雑なため、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のコードから同じことを達成する方法があるはず....

+0

「他の発信者」のサンプルを提供すると、それは素晴らしいことになります。このコードには、SQL Developerで成功したときに他のクライアントからのリフレッシュ中に失効したデータにアクセスできる必要があるため、このコードには固有のものがあります。彼らは何か特定のものを使用するかもしれません.. – g00dy

+0

実際にコードは特別なことをしません。 これは、具体的なDAO実装の汎用スーパークラスを介して名前付きクエリを呼び出す1ライナーです。 選択は(JPQLで) から選択します。AccountManagerCustomerAndInstituteDto aからzipCodeを選択します。(:zipCodes) –

+0

続き: DAOは、デフォルトの分離レベルが設定されたSpring AOP経由のトランザクションを取得します。 前に述べたように、私はトランザクション設定で成功しないで別の設定を試みました。 私はアプリケーションで完全な新しいDataSourceを設定しようとしても、同じ方法で「DataSourceからConnectionを取得し、ステートメントを準備することで」「JDBC-way」を試しました.MViewを待っていますリフレッシュする。 –

答えて

0

のOracle 12gは、新たなリフレッシュオプションを導入しましたこのオプションを使用するマテリアライズド・ビュー

out_of_place=>true

のためにOracleは、バックグラウンドで新しいデータで完全に新しいテーブルを構築し、それが終了したとき、この表にMVIEWの「ポインタ」を切り替えて、古いものを削除します。

ビューを更新するときにこのオプションを使用すると、Javaコードでは、古いビューの(おそらく古い)データにアクセスできますが、これは目的の動作です。

この新しいパラメータ(これは私には新しい)が私の問題を解決しました!

関連する問題