저는 비슷한 문제에 직면했습니다. 사용자/네트워크/도착한 곳에서 데이터가 도착할 때 데이터를 처리하는 코드가 있습니다. 효율성을 위해 수신 한 모든 데이터에 대해 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
을 사용해야합니다. 또 시작 이네.
인터넷 검색 "버퍼링 패턴"과 "버퍼링 관용구"는 흥미로운 결과를 생성하지 않습니다. 이것은 흥미로운 패턴이기 때문에입니까? – itsadok
위키피디아는 일반적으로 좋은 정의를 갖고있는 것으로 보인다 : http://en.wikipedia.org/wiki/Data_buffer –