2011-01-02 17 views
5

Znów mam do czynienia z podobnym problemem: jest jakiś fragment kodu, który przetwarza dane, które przybywają od użytkownika/sieci/produkuje jakiegoś rodzaju. Ze względów wydajnościowych nie chcę wywoływać flush() ani commit() na każdym otrzymywanym przeze mnie danych, ale tylko sporadycznie.okresowe zapisywanie/płukanie/zatwierdzanie - czy istnieje nazwa tego wzorca?

zwykle wymyślić kodu tak:

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(); 
    } 
} 

mam nieodparte wrażenie, że jestem odkrywanie koła na nowo za każdym razem, gdy piszę te słowa, a co więcej, ja ciągle się zmienia rzeczy za każdym razem piszę ten rodzaj kodu, zależnie od tego, czy różne części mają sens w konkretnym kontekście.

Wydaje mi się, że jest to bardzo powszechny wzorzec, ale nie pamiętam, aby został nazwany lub zaimplementowany jako narzędzie biblioteki. Tak długo, jak będę musiał to zaimplementować, mam do czynienia z paraliżem analizy za każdym razem, gdy będę go ponownie wdrażał. Proszę pomóż mi!

UPDATE: Po to pisałem, zdałem sobie sprawę, że nie stanowiły bufor do płukania przed JVM zamykania, więc dodałem hak zamykania w konstruktorze. Teraz zdałem sobie sprawę, że ten kod nadal nie będzie działał poprawnie, jeśli zamknięcie nastąpi mniej niż MIN_SAVE_PERIOD milisekund po ostatnim zapisie, więc prawdopodobnie powinienem refaktoryzować saveData. To się znowu dzieje.

Odpowiedz

2

Twój kod już to mówi: nazywa się to buforowaniem.

+0

Googling "wzorzec buforowania" i "idiom buforujący" nie daje żadnego interesującego wyniku. Czy to dlatego, że jest to nieinteresujący wzór? – itsadok

+0

Wikipedia wydaje się mieć dobrą ogólną definicję: http://en.wikipedia.org/wiki/Data_buffer –

Powiązane problemy