SQLクエリのキャッシュを必要とする分散アプリケーションを使用して複雑なプロジェクトに取り組んでいます.iBatisフレームワークを使用しているので、キャッシュエンジンとしてmemcachedを使用したいと思います-sysadminが必要です. 出来ますか?はいの場合、誰かが既存のソリューション/実装を知っていますか? OSCACHE がクラスターでも動作することは既に知っていますが、新しいアーキテクチャに切り替える前に、既存のアーキテクチャを使用できるかどうかを知りたいです。よろしくお願いします!!!
2 に答える
面白い質問です!
iBatisは1つ以上のJavaBeansを返します。これには、ネストされたJavaBeansのリストが含まれる場合があります。JavaBeanは、特定の単純な規則に準拠する単なるJavaオブジェクトであり、その1つは、Serializableインターフェースを実装することです。含まれている場合は、JavaBean構造をStringにシリアル化し、そのStringを逆シリアル化して元のJavaBean構造のディープコピーに戻すことができます。
したがって、すべての結果オブジェクトが「Serializableを実装する」ように宣言されていることを確認するとします。JavaBeansは非常に単純な構造であるため、デフォルトのJavaオブジェクトのシリアル化/逆シリアル化メカニズムをオーバーライドする必要はありません。これは良いことです。
これらのシリアル化された文字列は、memcachedクラスターの分散ハッシュマップに入力する値です。クエリを実行してその結果を返す各Javaメソッドで、最初にmemcachedで既存の結果を検索し、そこにあり、有効期限が切れていない場合は、クエリが(おそらく)返すJavaBeansにデシリアライズします。 。クエリ結果がmemcachedに見つからない場合は、iBatisを介してデータベースにクエリを実行しますが、結果を返す前に、結果を文字列にシリアル化し、その値をmemcachedに保存します。
次の質問は、memcachedクエリ結果キーに何を使用するかです。何かのようなもの
YourIbatisQueryName + ":" + FirstParameterValue + ":" + SecondParameterValue
動作するはずです(例:「SelectStackOverflowReputation:Simone:Tripodi」)。
ほぼ完成です。最後のステップは、クエリ結果が無効になることなくキャッシュできる期間を把握することです。クエリごとに異なる有効期限を設定できる場合もあれば、手動のキャッシュ無効化メカニズムが必要な場合もあります。クエリ結果をほんの数分でもキャッシュすると、アプリケーションのスケーラビリティに非常に大きな影響を与える可能性があります。
注:このアプローチのバリエーションは、デフォルトのJavaシリアル化を使用せず、XML、JSON、またはその他の形式を使用することです。XMLまたはJSONを選択した場合は、XStreamなどのシリアル化フレームワークを調べてJavaBeansをXML文字列にシリアル化/逆シリアル化し、再度元に戻します。
cacheController を拡張しますが、エイリアスは add global を使用します