2011-01-02 4 views
5

저는 비슷한 문제에 직면했습니다. 사용자/네트워크/도착한 곳에서 데이터가 도착할 때 데이터를 처리하는 코드가 있습니다. 효율성을 위해 수신 한 모든 데이터에 대해 flush() 또는 commit()으로 전화하고 싶지는 않지만 가끔씩 만 수신합니다.정기 세이브/플러시/커밋 -이 패턴의 이름이 있습니까?

나는 일반적으로 다음과 같은 코드와 함께 제공 :

class Processor { 
    private final static MAX_SAVE_PERIOD = 60000; 
    private final static MIN_SAVE_PERIOD = 20000; 

    private final static int MAX_BUFFER = 10000; 
    Arraylist<Data> dataBuffer = new Arraylist<Data>(); 

    private long lastSave = 0; 

    public Saver() { 
     new Timer().schedule(new TimerTask() { 
      periodicSave(); 
     }, MAX_SAVE_PERIOD, MAX_SAVE_PERIOD); 
     Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
      public void run() { 
       periodicSave(); 
      } 
     })); 
    } 

    public synchronized void processData(Data data) { 
     dataBuffer.add(data); 
     if(dataBuffer.size() >= MAX_BUFFER) { 
      saveData(); 
     } 
    } 

    private synchronzied void periodicSave() { 
     if(!dataBuffer.isEmpty()) { 
      saveData(); 
     } 
    } 

    private void saveData() { 
     if (System.currentTimeMillis() - lastSave < MIN_SAVE_PERIOD) return; 

     ...   

     lastSave = System.currentTimeMillis(); 
    } 
} 

가 나는 바퀴를 내가이 쓰기 때마다 개혁있어 독특한 느낌을 얻고, 무엇보다, 내가 물건을 내가 쓸 때마다 계속 변경 이러한 종류의 코드는 다양한 부분이 특정 상황에서 의미가 있는지에 따라 다릅니다.

이것은 매우 일반적인 패턴 인 것으로 보이지만 라이브러리 유틸리티로 명명되거나 구현 된 것을 기억하지 못합니다. 제가 직접 구현해야하는 한, 나는 그것을 다시 구현할 때마다 분석 마비에 직면 해 있습니다. 제발 도와주세요!

UPDATE :이 글을 쓰고 난 후에 JVM 종료 전에 버퍼를 비우는 것을 고려하지 않았기 때문에 생성자에 종료 훅을 추가했습니다. 이제 내가 마지막으로 저장 한 후 MIN_SAVE_PERIOD 밀리 초 미만으로 종료가 발생하면이 코드가 제대로 작동하지 않는다는 것을 알게되었습니다. 따라서 리 팩터 인 saveData을 사용해야합니다. 또 시작 이네.

답변

2

코드에 이미 버퍼링이라고 표시되어 있습니다.

+0

인터넷 검색 "버퍼링 패턴"과 "버퍼링 관용구"는 흥미로운 결과를 생성하지 않습니다. 이것은 흥미로운 패턴이기 때문에입니까? – itsadok

+0

위키피디아는 일반적으로 좋은 정의를 갖고있는 것으로 보인다 : http://en.wikipedia.org/wiki/Data_buffer –

관련 문제