Как долго сущности сохраняются? - PullRequest
3 голосов
/ 08 января 2012

Я пытаюсь понять, как работает JPA.Из того, что я знаю, если вы сохраните сущность, этот объект останется в памяти, пока приложение не будет закрыто.Это означает, что когда я ищу ранее сохраненную сущность, в базе данных не будет выполнено ни одного запроса.Предполагая, что вставка, обновление или удаление не производятся, если приложение работает достаточно долго, вся информация в нем может стать постоянной.Означает ли это, что в какой-то момент мне больше не понадобится база данных?

Редактировать

Моя проблема не с базой данных.Я уверен, что базу данных нельзя изменить извне приложения.Я управляю транзакциями самостоятельно, поэтому данные сохраняются в базе данных, как только я фиксирую.Мой вопрос: что происходит с сущностями после того, как я совершу коммит?Они хранятся в памяти и действуют как кеш?Если да, то как долго они там находятся?После того, как я фиксирую persist, я делаю запрос select.Этот выбор должен вернуть объект, который я сохранил ранее.Будет ли этот объект извлечен из памяти или приложение запросит базу данных?

Ответы [ 6 ]

5 голосов
/ 08 января 2012

Не совсем. Подумай об этом.

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

Хранение данных в памяти и надежда на то, что все будет хорошо, не принесут никакой пользы. Вот почему данные, хранящиеся в базе данных, являются вашим основным источником информации, и вам следует каждый раз запрашивать их, если только вы не уверены, что подмножество данных не изменится.

4 голосов
/ 08 января 2012

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

3 голосов
/ 08 января 2012

Если вы хотите сохранить свои сущности после фиксации и для запроса на выборку, вам нужно использовать кеш запросов. Просто поищите в Google этот термин, и он должен быть вам понятен.

3 голосов
/ 08 января 2012

JPA не может работать только с постоянным контекстом (кеш L1) или явным кешем (кэш L2).Его всегда нужно комбинировать с источником данных, и этот источник данных обычно указывает на базу данных, которая сохраняется в стабильном хранилище.

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

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

Однако кэш L2 не очищается, когда транзакция фиксируется, и сущности внутри нее остаютсядоступно для всего приложения.Этот кэш L2 должен быть явно настроен, и вы, как разработчик приложения, должны указать, какие объекты должны быть в нем кэшированы.С помощью механизмов, специфичных для разных поставщиков (например, JBoss Cache, Infinispan), вы можете установить максимальное количество кэшируемых сущностей и установить / определить так называемые политики удаления.

Конечно, ничто не мешает вам дать точку источника данныхв встроенную БД в памяти, но это вне знания JPA.

3 голосов
/ 08 января 2012

«Сохранить» сущность означает фактически сохранить ее в базе данных. Конечно, JPA хранит некоторую информацию об объектах в памяти в контексте постоянства (и это сильно зависит от конфигурации и практики программирования), но в определенный момент информация будет храниться в базе данных - например, когда транзакция совершается или вероятна ( но не обязательно) после flush() или merge() операций.

3 голосов
/ 08 января 2012

Постоянство означает в короткие сроки: вы можете закрыть свое приложение, и данные не будут потеряны.

Чтобы достичь этого, вам нужна база данных или какой-то вид сохранения данных таким образом, чтобы они не терялись приВы закрыли приложение.

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