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;

}

 

 

 

 

Posted by '김용환'
,