Рубиновые реализации шаблона карты идентичности

Я планирую реализовать карту идентификации для небольшого проекта, который не использует какой-либо инструмент ORM.

Стандартная реализация в большинстве примеров, которые я видел, - это просто хэш по идентификатору объекта, однако очевидно, что хэш будет расти без ограничений. Я думал об использовании memcahed или redis с истечением срока действия кэша, но это также означает, что срок действия некоторых объектов в кэше истечет, и их данные будут снова выбраны из базы данных под новым и другим объектом (одна и та же сущность в разных объектах в объем памяти).

Учитывая, что большинство ORM не требуют запуска memcached/redis. Как они решают эту проблему? Они действительно решают это? разве это не проблема, когда сущность представлена ​​повторяющимися экземплярами?

Единственное решение, которое я знаю, это языки, поддерживающие умные указатели и хранящие слабые ссылки в хэше. Мне не кажется, что такой подход можно использовать с Ruby, поэтому мне интересно, как этот шаблон обычно реализуется в Ruby ORM.

1 ответ

Решение

Я думаю, что они используют Hash, наверняка кажется, что DataMapper использует хэш. Я предполагаю, что карта идентичности для каждой сессии, которая, вероятно, сбрасывается после каждого запроса (также гарантирует, что транзакции сбрасываются до конца границы запроса). Таким образом, он может расти неограниченно, но имеет фиксированный горизонт, который очищает его. Если целью является проведение сеанса, который длится дольше и требует периодической очистки, то WeakRef может быть полезен. Однако я буду осторожен с сохранением карты идентификаторов в течение длительного периода, особенно если речь идет о параллелизме и есть какие-либо ожидания в отношении последовательных транзакционных изменений. Я знаю, что ActiveRecord рассматривал возможность добавления IdentityMap, а затем отказался от этой попытки. В зависимости от того, как извлекаются строки, может быть дублирование, но, вероятно, оно меньше, чем вы думаете, ИЛИ запрос следует переосмыслить.

Другие вопросы по тегам