2011-01-02 14 views
5

Me encuentro una y otra vez frente a un problema similar: hay una pieza de código que procesa datos a medida que llega del usuario/red/produce de algún tipo. Por razones de eficiencia, no deseo llamar al flush() o commit() en cada dato que recibo, pero solo ocasionalmente.save/flush/commit periódico: ¿hay un nombre para este patrón?

por lo general vienen con un código como éste:

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

tengo la sensación de que estoy reinventar la rueda cada vez que escribo esto, y lo que es más, seguir cambiando cosas cada vez que escribo este tipo de código, dependiendo de si las diversas partes tienen sentido en el contexto específico.

Me parece que este es un patrón muy común, pero no recuerdo haberlo visto nombrado o implementado como una utilidad de biblioteca. Siempre que tenga que implementar esto yo mismo, sigo enfrentando parálisis de análisis cada vez que lo reimplante. ¡Por favor, ayúdame!

ACTUALIZACIÓN: Después de escribir esto, me di cuenta de que no había explicado el enjuague del búfer antes del cierre de JVM, así que agregué un gancho de cierre en el constructor. Ahora me he dado cuenta de que este código no funcionará correctamente si el apagado ocurre menos de MIN_SAVE_PERIOD milisegundos después del último guardado, por lo que probablemente debería refactorizar saveData. Está ocurriendo otra vez.

Respuesta

2

Tu código ya lo dice: se llama buffering.

+0

Googleing "patrón de almacenamiento en búfer" y "idioma de almacenamiento en búfer" no produce ningún resultado interesante. ¿Esto es porque es un patrón poco interesante? – itsadok

+0

Wikipedia parece tener una buena definición general: http://en.wikipedia.org/wiki/Data_buffer –

Cuestiones relacionadas