поле, и атомарно поменяйте поле для нового пустого кэша, затем скопируйте содержимое старого кэша в базу данных и разрешите его GCed.
олняю свой кеш guava из нескольких потоков, вызываяadd
метод. Теперь из фонового потока, который запускается каждые 30 секунд, я хочу отправить все, что есть в кеше,sendToDB
метод атомарно?
Ниже мой код:
public class Example {
private final ScheduledExecutorService executorService = Executors
.newSingleThreadScheduledExecutor();
private final Cache<Integer, List<Process>> cache = CacheBuilder.newBuilder().maximumSize(100000)
.removalListener(RemovalListeners.asynchronous(new CustomRemovalListener(), executorService))
.build();
private static class Holder {
private static final Example INSTANCE = new Example();
}
public static Example getInstance() {
return Holder.INSTANCE;
}
private Example() {
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// is this the right way to send cache map?
sendToDB(cache.asMap());
}
}, 0, 30, SECONDS);
}
// this method will be called from multiple threads
public void add(final int id, final Process process) {
// add id and process into cache
}
// this will only be called from single background thread
private void sendToDB(ConcurrentMap<Integer, List<Process>> holder) {
// use holder here
}
}
Это правильный способ отправкиcache
карта к моемуsendToDB
метод? По сути, я хочу отправить все записи, которые есть в кэше за эти 30 секунд, и очистить кэш. После этого мой кеш будет снова заполнен в течение следующих 30 секунд, а затем выполнить тот же процесс?
Я думаю, используяcache.asMap()
может быть неправильным путем, так как он не очищает кэш, поэтому он будет отражать все изменения, происходящие с кешем в моемsendToDB
метод, а?