はじめに
マテビューリフレッシュのタイミングにマテビューからのデータ取得処理が走っており、
その時に意図しないNullPointerException
が発生していました。
必ずヒットするマテビューなのでコードを見ても原因を特定できず、
リフレッシュ回りを調べてみたところ「なるほど…」となったため備忘録として残します。
環境
oracle:12.2.0.1.0
原因
こちらで紹介してくださっていますが、
・atomic_refresh
がtrue
:delete
によってデータを削除する
・atomic_refresh
がfalse
:trancate
によってデータを削除する
という違いがあるようです。
現状のリフレッシュ処理を確認すると、以下のようにfalse
が設定されていました。
exec dbms_mview.refresh(list=>'&1',method=>'C',atomic_refresh=>FALSE);
delete
はトランザクションが効き、trancate
はトランザクションが効きません。
そのためatomic_refresh
をfalse
でリフレッシュするとテーブルの中身が無くなるタイミングが生じます。
結果
trancate
を用いたリフレッシュが動いたことで一時的にテーブルの中身が無くなり、
そのタイミングで取得処理が動いたことによってデータが取得できずに
NullPointerException
が発生していたようです。
最後に
atomic_refresh
をtrue
にすることでエラーは発生しなくなりそうですが、
今度はdelete
でどれくらい時間がかかるか調べる必要がありそうです。
どなたかの参考になりましたら幸いです。