OSCahce에 존재하지 않는 데이터를 반복적으로 호출하는 경우, 쓰레드 락이 걸려서 어플리케이션이 문제 될 수 있다.
List result = null;
try {
result = (List) admin.getFromCache("aaa");
} catch (NeedsRefreshException e) {
throw e;
}
OSCache GeneralCacheAdministrator 객체안에 Cache가 있고, updateStatus라는 object를 이용하여 key에 대한 wait를 하고, notify하는 구조로 되어 있다.
즉, get을 할 때는 wait() 콜을, set을 할 때는 notifyAll()로 구성되었다.
웹에서는 한꺼번에 리퀘스트가 몰려오거나, 리스타트시에 자주 발생될 수 있다.
현상은 CLOSE_WAIT가 많이 생기고 apache full이 일어나면서 L4에서 서버가 빠진다.
이 문제를 해결하기 위해서는 미리 oscache에 데이터를 미리 넣어두는 것이 최고다. 그게 어렵다면.. putIncache나 cancelupdate () 메소드를 호출해서 notifyAll() 시켜라~
List result = null;
try {
result = (List) admin.getFromCache("aaa");
} catch (NeedsRefreshException e) {
admin.cancelUpdate("aaa"); // 내부적으로 notifyAll()을 호출. wait하고 있는 객체를 깨움
// 또는 admin.putInCache(...);
throw e;
}
'web' 카테고리의 다른 글
Content-disposition 속성 (0) | 2009.02.13 |
---|---|
dbcp가 자주 끊길 때.. (0) | 2009.02.11 |
자바 웹 어플리케이션 - commons-pool-1.4 + commons-dbcp-1.2.2 Deadlock (0) | 2009.02.06 |
아파치 query string 붙이지 않고 날리기 (0) | 2009.01.31 |
rewrite에서 exclude 사용하기 (0) | 2009.01.30 |