はじめに
マテビューリフレッシュのタイミングにマテビューからのデータ取得処理が走っており、
その時に意図しない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でどれくらい時間がかかるか調べる必要がありそうです。
どなたかの参考になりましたら幸いです。