前提:
双方向1対多関連で
Department(1) <---> Employee(多)
目標:Employeeを200件とってくる時間(api_cpu_ms)を減らしたい。
実験1:普通に検索でとってくる
List
ls = Datastore.query(b)
.filter(b.departmentID.equal("dep001"))
.limit(200)
.asList();
時間:2000api_cpu_msくらい。コストが大きすぎる。
実験2:検索結果の内容を文字列としてキャッシュしておく(ひとつのエンティティのみ取得)
時間:5api_cpu_msくらい。まあ1つしかアクセスしないんだから当然と言えば当然。
今作ろうとしているアプリケーションは、200件分のEmployeeを頻繁にreadし、また頻繁にwrite(add,update,delete)もされるような仕様となっている。
なので、上記のようなキャッシュの仕組みを取ることで、read時の負荷は大幅に減らせるものの、
write時(update)の負荷に関してどうしたらいいのか、とさまよっていた。
頻繁にwrite(add,update,delete)するといっても、200件全てを変更するわけでなく、その内の1件だけを変更する。
でも、その更新の度に200件分の検索結果としてキャッシュを作らなければならないため、やはり、200件すべてを取ってくる必要がある。
つまり更新の度に2000api_cpu_msを消費してしまう。
これはたぶんMemcacheを使っても同じ理屈で破綻すると思う。
そこで実験3。
実験3:Slim3のリレーション(ModelRef)を使ってみた
List
employeeList = department.getEmployeeListRef().getModelList();
しかし、時間は1800api_cpu_msくらいで、実験1のように普通に検索したときとほとんど変わらなかったorz
なんか良い方法はないのかな
誰か助言を下さい
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
追記:
その後いろいろ考えて、キャッシュをキャッシュとしてだけでなく、データそのものとして扱ってはどうかと考えました。
つまり200件のデータを、ひとつのエンティティの中に文字列として持っておき、更新時には、文字列処理で、書き換える。
自分のアプリの仕様の場合はこれでいけそう。