2011-01-02 2 views
5

Ich bin immer wieder konfrontiert mit einem ähnlichen Problem: Es gibt ein Stück Code, der Daten verarbeitet, wie es vom Benutzer/Netzwerk/produziert von einer Art ankommt. Aus Gründen der Effizienz möchte ich nicht auf allen Daten, die ich erhalte, sondern nur gelegentlich, flush() oder commit() anrufen.periodisches Speichern/Flush/Commit - gibt es einen Namen für dieses Muster?

ich in der Regel mit Code wie folgt kommen:

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

ich das deutliche Gefühl, dass ich das Rad jedes Mal bin neu zu erfinden ich dies schreibe, und was mehr ist, ich Sachen ständig ändern jedes Mal, ich schreibe Diese Art von Code hängt davon ab, ob die verschiedenen Teile im jeweiligen Kontext sinnvoll sind.

Es scheint mir, dass dies ein sehr häufiges Muster ist, aber ich erinnere mich nicht daran, es als ein Bibliotheksdienstprogramm benannt oder implementiert zu sehen. Solange ich dies selbst umsetzen muss, stehe ich immer dann vor Analyseparalyse, wenn ich es neu implementiere. Bitte hilf mir!

AKTUALISIEREN: Nachdem ich dies geschrieben hatte, erkannte ich, dass ich nicht für das Löschen des Puffers vor dem JVM-Herunterfahren berücksichtigt habe, also fügte ich einen Shutdown-Hook im Konstruktor hinzu. Jetzt habe ich erkannt, dass dieser Code immer noch nicht richtig funktioniert, wenn das Herunterfahren weniger als MIN_SAVE_PERIOD Millisekunden nach dem letzten Speichern passiert, so dass ich wahrscheinlich saveData refaktorieren sollte. Es passiert schon wieder.

Antwort

2

Ihr Code sagt es bereits: es heißt Pufferung.

+0

Googeln "Puffermuster" und "Puffer-Idiom" führt zu keinem interessanten Ergebnis. Liegt das daran, dass es ein uninteressantes Muster ist? – itsadok

+0

Wikipedia scheint eine gute allgemeine Definition zu haben: http://en.wikipedia.org/wiki/Data_buffer –

Verwandte Themen