問題
Java アプリケーションとデータベースの間の自動キャッシング ミドルウェアをプログラミングしています。クエリを解析し、クエリ MD5 ハッシュを取得して、CachedResultSet をキー値サービスに格納します。
特定の結果セットへの更新時に自動キャッシュ無効化を実装したいと考えています。そのためには、INSERT、DELETE、または UPDATE クエリが、結果がキャッシュされる SELECT クエリの結果に影響するかどうかを確認する必要があります。
例
次の SELECT クエリがあるとします。
Q1 -SELECT * FROM TEST WHERE TEST_COLUMN > 1500 AND TEST_COLUMN_2 = 'TEST';
Q2 -SELECT TEST_COLUMN_2 FROM TEST;
結果セットをキャッシュします。その後、更新:
Q3 -UPDATE TEST SET TEST_COLUMN_2='TEST' WHERE TEST_COLUMN<1000;
Q4 -UPDATE TEST SET TEST_COLUMN_2='TEST2';
Q3はQ1の結果セットに影響しないため、キャッシュの無効化は必要ありません。
Q3はQ2の結果セットに影響するため、キャッシュの無効化が必要です。
Q4はQ1、Q2の結果セットに影響するため、キャッシュの無効化が必要です
最も簡単な解決策
最も簡単な解決策は、特定のテーブルで実行されるすべてのクエリを、列を使用してマップ形式で格納することです。ここで、* はすべての列を意味します。
DATABASE_A: {
SCHEMA_A:{
TABLE_TEST:{
*:[Q1], // invalidated by: Q3,Q4
TEST_COLUMN:[Q1], // invalidated by: none -> used as condition in Q3
TEST_COLUMN2:[Q1,Q2] // invalidated by: Q3,Q4
},
TABLE_TEST2: {
*:[Qx]
}
}
}
したがって、テーブル TEST の列 TEST_COLUMN2 で更新が発生すると、Q2のクエリ結果キャッシュが無効になります。
INSERTS と DELETES は、テーブルのすべてのクエリ キャッシュを無効にします
この方法の欠点は、つまり、Q1がQ3によって無効になることです。これは、交差集合が空になるような選択条件の分析が行われていないためです。
質問
2 つのクエリの条件が重複または矛盾しているかどうかを確認するソリューションはありますか?クエリの条件によってはすべてのクエリを無効にする必要はありませんか?