Можно ли создать счетчик в памяти, который будут использовать все сервлеты?
Этот глобальный счетчик будет отслеживать просмотры страниц для веб-приложения, и этот счетчик будет зависеть от текущего пользователя, вошедшего в систему. то есть в коллекции будет ключ для каждого пользователя.
globalCounterMap[userId].incrementCounter += 1;
Через определенный интервал или количество просмотров страниц я хочу сохранить текущий счетчик в mysql (вставить новую строку), например ::
table_pageviews [id, userId, pageview_count, date]
Таким образом, этот счетчик будет сброшен на 0 после сброса.
Итак, если у меня есть BaseServlet, от которого будут наследоваться все сервлеты, как бы я определил это поле? (окончательно, статично?)
Подходит ли ConcurrentHashMap? Может быть, я могу сохранить AtomicLong для значения для каждой записи.
Во время сброса я могу использовать getAndSet атомарного длинного, установив в 0 и сохранив полученное значение: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/atomic/AtomicLong.html
Нужно ли синхронизировать процесс flush to mysql? (Скажем, я делаю это каждые 1К просмотров)
Обновление
Так что, даже если у меня есть 10 серверов, каждый со своими счетчиками в памяти, все будет работать, поскольку все они в конечном итоге сбросят свои значения в БД, а затем я просто объединю строки, чтобы получить окончательные значения.