Ответ 1
Hibernate documentation неплохо справляется с их определением:
19.2.2. Стратегия: только для чтения
Если ваше приложение необходимо прочитать, но не изменять, экземпляры постоянного класс, можно использовать кеш-доступ только для чтения. Это самый простой и оптимальный выполняя стратегию. Это даже безопасно для использования в кластере.
19.2.3. Стратегия: чтение/запись
Если приложение необходимо обновить данных, кеш чтения-записи может быть подходящее. Эта стратегия кэширования никогда не следует использовать, если сериализуемое уровень изоляции транзакций обязательный. Если кеш используется в JTA, вы должны указать имущество
hibernate.transaction.manager_lookup_class
и называя стратегию получения JTATransactionManager
. В других окружающей среды, вы должны обеспечить, чтобы транзакция завершается, когдаSession.close()
илиSession.disconnect()
. если ты хотите использовать эту стратегию в кластера, вы должны убедиться, что реализация основного кеша поддерживает блокировку. Встроенный кеш провайдеры не поддерживают блокировку.19.2.4. Стратегия: нестрочное чтение/запись
Если приложение только изредка необходимо обновить данные (т.е. если это крайне маловероятно, что два транзакции будут пытаться обновить один и тот же элемент одновременно) и строгий изоляция транзакций не требуется, кеш нестрочного чтения-записи может быть подходящее. Если кеш используется в JTA, вы должны указать
hibernate.transaction.manager_lookup_class
. В других средах вы должны убедитесь, что транзакция завершено, когдаSession.close()
илиSession.disconnect()
.19.2.5. Стратегия: транзакционная
Стратегия кэширования транзакций обеспечивает полную поддержку поставщиков транзакционных кешей, таких как JBoss TreeCache. Такой кеш может использовать в среде JTA, и вы должен указать
hibernate.transaction.manager_lookup_class
.
Другими словами:
-
Только для чтения: Полезно для данных, которые часто читаются, но никогда не обновляются (например, ссылочные данные, такие как Страны). Это просто. У него лучшие результаты (очевидно).
-
Чтение/запись: Желательно, чтобы ваши данные нуждались в для обновления. Но он не обеспечивает уровень изоляции SERIALIZABLE, phantom читает (вы можете увидеть в конце транзакции то, чего не было в начале). Он имеет больше накладных расходов, чем только для чтения.
-
Nonstrict read/write: Альтернативно, если маловероятно, что два отдельных потока транзакций могут обновлять один и тот же объект, вы можете использовать стратегию нестрочного чтения-записи. У него меньше накладных расходов, чем чтение-запись. Это полезно для данных, которые редко обновляются.
-
Транзакция: Если вам нужен полностью транзакционный кеш. Подходит только в среде JTA.
Итак, выбор правильной стратегии зависит от того, что данные обновляются или нет, частота обновлений и требуемый уровень изоляции. Если вы не знаете, как отвечать на эти вопросы на данные, которые вы хотите поместить в кеш, возможно, попросите некоторую поддержку от администратора базы данных.