30.7.3.2. on-load
on-load
ストラテジーは、あるエンティティがロードされるときに、いくつかのエンティティの追加データをブロックでロードするもので、要求されたエンティティから開始し、選択された順序で次のいくつかのエンティティをロードします。このストラテジーは、find または select の結果が順方向にアクセスされるという理論に基づきます。クエリーが実行されると、JBoss は、見つかったエンティティの順番をリストキャッシュに格納します。後で、エンティティのいずれかがロードされるとき、JBoss はこのリストを使用して、ロードするエンティティのブロックを決定します。キャッシュに格納するリスト数は、エンティティの list-cachemax
要素で指定します。このストラテジーは、on-find
ストラテジーでデータがロードされないという問題があるときにも使用されます。
on-find
ストラテジーと同様に、on-load
は read-ahead
要素で宣言します。この例の on-load
設定を次に示します。
<jbosscmp-jdbc> <enterprise-beans> <entity> <ejb-name>GangsterEJB</ejb-name> <!-- ... --> <query> <query-method> <method-name>findAll_onload</method-name> <method-params/> </query-method> <jboss-ql><![CDATA[ SELECT OBJECT(g) FROM gangster g ORDER BY g.gangsterId ]]></jboss-ql> <read-ahead> <strategy>on-load</strategy> <page-size>4</page-size> <eager-load-group>basic</eager-load-group> </read-ahead> </query> </entity> </enterprise-beans> </jbosscmp-jdbc>
このストラテジーによって、finder メソッドのクエリーは変更されません。
SELECT t0_g.id FROM gangster t0_g ORDER BY t0_g.id ASC
しかし、結果セットを反復するので、データのロード方法は異なります。ページサイズが 4 の場合、JBoss は、エンティティの
name
、nickName
、badness
フィールドをロードするのに、次の 2 つのクエリーを実行するだけでよくなります。
SELECT id, name, nick_name, badness FROM gangster WHERE (id=0) OR (id=1) OR (id=2) OR (id=3) SELECT id, name, nick_name, badness FROM gangster WHERE (id=4) OR (id=5) OR (id=6) OR (id=7)
次の表は、これらのクエリーの実行を示したものです。
表30.3 on-load 最適化クエリー実行
id | name | nick_name | badness | hangout | organization |
---|---|---|---|---|---|
0 | Yojimbo | Bodyguard | 7 | 0 | Yakuza |
1 | Takeshi | Master | 10 | 1 | Yakuza |
2 | Yuriko | Four finger | 4 | 2 | Yakuza |
3 | Chow | Killer | 9 | 3 | Triads |
4 | Shogi | Lightning | 8 | 4 | Triads |
5 | Valentino | Pizza-Face | 4 | 5 | Mafia |
6 | Toni | Toothless | 2 | 6 | Mafia |
7 | Corleone | Godfather | 6 | 7 | Mafia |