私のアプリケーションは、SpringとHibernateフレームワークのTomcatで動作しています。 EHCacheは、サービスレベルでキャッシュプロバイダとして使用されます。つまり、サービスクラスによって作成されたオブジェクトがキャッシュに格納されます。 (Daoオブジェクトを休止しない)。マルチスレッド環境のキャッシュコレクション上の無限ループ
これらのキャッシュオブジェクトには、いくつかのコレクションオブジェクト(HashSet、ArrayList、HashMap)があります。それらのうちのどれも同期されたコレクションではありません。すべてスレッドセーフではありませんが、キャッシュに入れた後はアプリケーションによって変更されません。
このコレクションをループすると、多くの場合無限ループが検出されました。いくつかのループはイテレータループであり、他のものはintインデックス上のループ実行のために古いものです。
私は、HashSetをCollections.synchronizedSet(new HashSet())に置き換えることによって、無限ループを克服することができました。しかし、通常のHashSetをアプリケーションで変更することはないので、実際の問題を理解できません。 (EHCacheでそれらを変更しますか?)
スレッドセーフでないコレクションを使用している場合は、ここで問題がある場合は、私に説明してください。
public class HotelDetails implements Serializable { /*Objects in the cache */
private static final long serialVersionUID = 1L;
.....
private Set<String> facilities = new HashSet<String>();
}
ループが一回のHashSetを置き換える、問題は
public class HotelDetails implements Serializable { /*Objects in the cache */
private static final long serialVersionUID = 1L;
.....
private Set<String> facilities = Collections.synchronizedSet(new HashSet<String>());
}
を解決し、これは別の1
private int getRatesStartIndex(GsRoomRate gsRoomRate, List<GsRate> gsRates, Date travelStart) {
Integer startIndex = gsRoomRate.getGsRateIndexes().get(travelStart);
if (startIndex==null) {
for (startIndex=0; startIndex<gsRates.size(); startIndex++) {
GsRate gsRate = gsRates.get(startIndex);
if (travelStart.between(gsRate.getStartDate(), gsRate.getEndDate())) {
gsRoomRate.getGsRateIndexes().put(travelStart, startIndex);
break;
}
}
if (startIndex>=gsRates.size()) startIndex = 0;
}
return startIndex;
}
public class GsRoomRate implements Serializable { /*Objects in the cache */
private static final long serialVersionUID = 1L;
private List<GsRate> gsRates = new ArrayList<GsRate>();
private Map<Date, Integer> gsRateIndexes = new HashMap<Date, Integer>();
}
public class GsRate implements Serializable { /*Objects in the cache */
private static final long serialVersionUID = 1L;
private RBADate startDate;
private RBADate endDate;
}
いくつかのコードを表示してください... –
同期セットに変更した後、あなたの呼び出しは戻ってきますか?どのようにあなたは無限ループに入っていることを知っていますか?ヒープスペースが足りなくなっているため、あなたはあなたが無限ループにいると思うことを示しているようです...? –