翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
データベースクエリ結果のキャッシュ
データベースクエリのレイテンシーを減らす一般的なパターンは、クエリキャッシュです。アプリケーションは、データベースクエリに関連付けられた結果をキャッシュにクエリしてクエリキャッシュを実装し、キャッシュされている場合はその結果を返します。キャッシュされた結果が見つからない場合、クエリはデータベースで実行され、結果がキャッシュに入力され、その結果はクエリを開始するアプリケーションに返されます。その後、後続のデータベースクエリは、キャッシュに残っている限り、キャッシュされた結果を返します。
クエリキャッシュを使用するタイミング
ElastiCache を使用したクエリキャッシュは、次のワークロードタイプで最も効果的です。
-
同じクエリが頻繁に変更されないデータで繰り返し実行される読み取り負荷の高いアプリケーション。
-
インデックス作成されていないルックアップ、集計、またはクエリ実行時間が長いマルチテーブル結合などの高価なクエリ。
-
読み取りを ElastiCache にオフロードすると、データベースの CPU 負荷が軽減され、全体的なスループットが向上します。
クエリキャッシュは、強力な整合性が必要なクエリや、read-after-write整合性を必要とする複数ステートメントトランザクション内のクエリにはお勧めしません。
AWS アドバンスト JDBC ラッパーの使用
アプリケーションで JDBC ドライバーを使用してリレーショナルデータベースをクエリしている場合は、AWS アドバンスト JDBC ラッパー
プラグインでのクエリキャッシュの仕組み
リモートクエリキャッシュプラグインを使用すると、PostgreSQL、MySQL、または MariaDB データベースにクエリを実行する Java アプリケーションが、クエリ結果を ElastiCache に自動的にキャッシュすることが容易になります。キャッシュエンドポイント情報を使用してプラグインを設定し、クエリヒントを使用してキャッシュするコード内のクエリを指定します。プラグインがヒントクエリを検出すると、存在する場合はキャッシュからクエリ結果を返します (キャッシュヒット)。結果がキャッシュにない場合 (キャッシュミス)、プラグインはデータベースでクエリを実行し、結果をキャッシュに保存して、結果をアプリケーションに返します。これにより、次回クエリが実行されたときにキャッシュから結果を提供できます。
キャッシュヒント
キャッシュするクエリを制御するには、各クエリにヒントを設定します。クエリヒントは、コメントプレフィックスを使用してアプリケーションコードのクエリ文字列に直接適用できます。
/* CACHE_PARAM(ttl=300s) */ SELECT * FROM my_table WHERE id = 42
ここで、 ttlは有効期限を秒単位で表します。 time-to-live Hibernate や Spring Boot などの一般的なフレームワークを使用して、準備済みステートメントでクエリヒントを設定することもできます。
前提条件
アプリケーションでリモートクエリキャッシュプラグインを使用するには、ElastiCache for Valkey または Redis OSS キャッシュ (サーバーレスとノードベースの両方がサポートされています) と以下の依存関係が必要です。
-
AWS アドバンスト JDBC ラッパー
バージョン 3.3.0 以降。 -
Apache Commons Pool
バージョン 2.11.1 以降。 -
Valkey Glide
バージョン 2.3.0 以降。
例: プラグインを使用したクエリのキャッシュ
次の例は、プラグインを有効にし、ElastiCache for Valkey サーバーレスキャッシュを使用してクエリ結果を 300 秒 (5 分) キャッシュする方法を示しています。
import java.sql.*; import java.util.Properties; public class QueryCacheExample { public static void main(String[] args) throws SQLException { Properties props = new Properties(); props.setProperty("user", "myuser"); props.setProperty("password", "mypassword"); // Enable the remote query cache plugin props.setProperty("wrapperPlugins", "remoteQueryCache"); // Point to your ElastiCache endpoint props.setProperty("cacheEndpointAddrRw", "my-cache.serverless.use1.cache.amazonaws.com:6379"); Connection conn = DriverManager.getConnection( "jdbc:aws-wrapper:postgresql://my-database.cluster-abc123.us-east-1.rds.amazonaws.com:5432/mydb", props ); Statement stmt = conn.createStatement(); // The SQL comment hint tells the plugin to cache this query for 300 seconds ResultSet rs = stmt.executeQuery( "/* CACHE_PARAM(ttl=300s) */ SELECT product_name, price FROM products WHERE category = 'electronics'" ); while (rs.next()) { System.out.println(rs.getString("product_name") + ": $" + rs.getBigDecimal("price")); } rs.close(); stmt.close(); conn.close(); } }
このクエリを初めて実行すると、結果はデータベースから返され、ElastiCache にキャッシュされます。次の 300 秒間、そのクエリの後続の実行はキャッシュから直接処理されます。
関連リソース
プラグイン設定に関するより広範な例と詳細については、リモートクエリキャッシュプラグインドキュメント