2015-05-07 4 views
0

Я разрабатываю систему заказа, и вот мой сценарий: у меня есть класс, который содержит новые заказы, такие как стратегия «кэширования». В это время, я использую HashMap, как это:Is WeakReference Что мне нужно?

public static final Map<Long, Order> orders = new HashMap<Long, Order>(); 

Где я отождествляю заказ однозначно в long (что не приходит из БД, это просто порядковым переменная). Причина, по которой я не сохраняю его из БД, заключается в том, что, например: сотрудник регистрирует заказ, поступающий с телефонного звонка, и вдруг клиент больше не хочет заказывать, так что я не буду заполнять свою БД неиспользуемым регистр. Исходя из этого, я ищу подход, чтобы держать все заказы и «чистить автоматически» индексы, которые больше не используются.

Я просмотрел WeakReference, но я не знаю, действительно ли это действительно нужно. Я открыт для любого предложения.

Заранее спасибо.

+0

Почему бы вам просто не хранить данные в объекте, когда сотрудник вводит их, и только сохранить их все в базе данных, когда клиент подтвердил заказ? В любом случае «длинный» id звучит так, будто он должен быть ключом на уровне базы данных, а не тем, что вы выбираете на уровне Java (если вы укажете AUTO_INCREMENT на своем id на db, вы получите гарантию согласованности бесплатно.) – berry120

+0

Я бы рекомендовал использовать инструмент ORM, например Hibernate. Вы можете сохранить 'Order' в базу данных, когда они будут подтверждены. –

+0

потому что: 1) одновременно может быть более одного сотрудника, регистрирующего заказы; 2) Я учу этот объект другими классами, так что мне нужно что-то однозначно идентифицировать каждый заказ Я думаю, что сохранение его в БД небезопасно, потому что каждый раз, когда пользователь открывает экран для регистрации заказа , создается новый порядок. Итак, если пользователь «misclick» будет иметь еще один неиспользуемый регистр в DB ... – lucasdc

ответ

2

Для этого вам не нужен WeakReference. A WeakReference используется в случае, когда вы кешируете большие объекты в памяти (скажем, изображение), и вы хотите указать, что это нормально для сборщика мусора, чтобы удалить это изображение, если свободная память становится разреженной. В этом случае вы можете всегда перезагружать изображение с диска позже, поэтому вам все равно, если он будет удален из памяти.

Для вашей ситуации я бы использовал простой HashMap. Как только клиент подтвердит, что он действительно хочет получить заказ, вы можете сохранить его в базе данных.

Если заказчику не нужен заказ, просто удалите его из HashMap - очень недорогой операции.

EDIT:

Вы можете также искать для "Timed Cache". Что-то вроде HashMap, который автоматически истекает любой ключ/значение через определенное количество времени. Google Guava имеет такую ​​структуру данных. См. related SO question.

+0

«Если клиент не хочет этого заказа, просто удалите его из HashMap». Проблема в том, что я не всегда могу знать, когда заказ не будет завершен, как я уже сказал в своем комментарии выше, - потому что каждый раз, когда пользователь открывает экран для регистрации заказа, создается новый порядок ». Итак, если сотрудник «misclick», а затем попытается получить доступ к другой странице, я не знаю, что этот заказ не будет завершен. – lucasdc

+0

Если сотрудник неправильно щелкнул мышью и создал новый заказ, могут ли они вернуться к старой? Если да, то ваш лучший выбор - просто отложить старый порядок через некоторое время. –

+0

«Неиспользованный заказ» будет потерян в космосе :). Как я могу отложить заказ? Есть ли способ сделать это без чего-то вроде открытия потока и проверки каждого X-времени, если установлена ​​переменная, или использования сторонних библиотек (таких как Guava)? – lucasdc

 Смежные вопросы

  • Нет связанных вопросов^_^