Hibernate Кэш второго уровня в случае мягкого удаления - PullRequest
1 голос
/ 14 октября 2011

Операции чтения очень высоки по сравнению со вставкой / обновлением / удалением для модуля основных данных.До сих пор мы используем JDBC для операций чтения, записи и обновления.Мы выполняем мягкое удаление (помечая столбец IS_DELETED «Y») при операции удаления.Все методы записи / обновления синхронизируются для обработки параллелизма.Мы используем Oracle и не планируем поддерживать несколько баз данных.

Теперь мы планируем кэшировать данные, а также планируем кластеризацию.

Самый простой вариант, который у нас есть, этоизменить методы вставки / обновления / удаления и использовать что-то вроде ehcache для управления кешем в соответствии с нашим требованием и обработки параллелизма в кластерной среде с помощью столбца версии в таблице и удаления синхронизированного ключевого слова.

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

Вот мои сомнения:

1) Стоит ли менять полный код DAO, если у нас есть около 200 таблиц для управления основными данными?.

2) Поможет ли в этом случае спящий режим кэша второго уровня, если нам нужноснова отфильтруйте кэшированные данные, чтобы удалить удаленные строки, или в спящем режиме есть механизм (или любой другойспособ) с помощью которого мы можем выполнить операцию обновления в базе данных, но удалить операцию в кэшированных данных?

3) Мы представили объекты передачи данных другим модулям, в которых все поля таблицы с первичным ключом хранятся вотдельные объекты PK (имеющие поля первичного ключа в отдельном объекте), и у нас нет ссылки на DO (составной DO там нет).Учитывая это, мы не можем позволить себе изменять открытые методы и структуру DO - так нужно ли нам снова упаковывать данные кэшированных объектов в наш DO?Или мы можем повторно использовать старую структуру DO как спящий объект (согласно моему пониманию, столбец PK должен находиться там непосредственно в объекте hibenate, а не в каком-либо составном объекте).Я упомянул составное DO, потому что у нас также есть требование зависимого раскрывающегося списка, которое можно было бы использовать с отложенной загрузкой в ​​спящем режиме для дочерних объектов, если бы у нас был составной DO в первую очередь.Аргументом против является предоставление новых методов, которые будут использовать кэшированные данные и ограничивать использование старых методов.Другие модули будут медленно мигрировать в соответствии с их потребностью в кэшировании, но у нас будут проблемы с обслуживанием, так как мы должны поддерживать оба метода в случае изменений в БД.Кроме того, 1 и 2 сомнения все еще существуют.

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

1 Ответ

1 голос
/ 14 октября 2011

Если вы планируете перейти в спящий режим, вы должны принять во внимание 1) Вам нужно будет сопоставить всю свою структуру с POJO (если вы еще этого не сделали) 2) Переписать все DAO для использования hibernate (имея в виду, что API QL / критериев гибернации имеет определенные ограничения 3) Будьте готовы бороться с ленивыми проблемами инициализации и так далее ... Лично я не думаю, что стоит переходить в спящий режим с работающей моделью, если поддерживать текущую модель крайне болезненно

Относительно ваших 2 и 3 вопросов 2) Кэш второго уровня содержит только загруженные экземпляры, доступ к которым осуществляется по первичному ключу. то есть если вы скажете hibernateSession.load (User, 10) - он будет искать объект User в кэше второго уровня, используя id = 10. Если я понимаю, что это не так. Большую часть времени вы хотите загрузить свои данные, используя более сложный запрос - в этом случае вам понадобится StandarQueryCache, который сопоставит строку запроса со списком загруженных идентификаторов, которые, в свою очередь, будут получены из кэша второго уровня. Но если у вас много запросов с низким сходством - и StandartQueryCache, и кэш второго уровня будут бесполезны (посмотрите http://darren.oldag.net/2008/11/hibernate-query-cache-dirty-little_04.html) 3) Вы можете использовать компоненты и тому подобное, но я не уверен насчет вашей структуры DTO.

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...