Как я могу вытащить объекты из спящего в память. У меня проблемы с сессией - PullRequest
0 голосов
/ 18 мая 2009

У меня довольно громадный проект, в котором я пытаюсь модифицировать данные в памяти. По сути, у меня есть большая коллекция объектов, которые содержат примитивы и другие объекты, которые существуют в спящем режиме. Большие фрагменты кода, отличного от дао, полагаются на ленивую загрузку через спящий режим для гидратации объектов на лету. Однако, поскольку все существует в памяти, мой объект не загружен, и я получаю исключения отложенной загрузки в спящем режиме.

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

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 18 мая 2009

Если вы обрабатываете сессии вручную, попробуйте передать идентификаторы объектов (идентификаторы строк в базе данных) вместо полных объектов. Затем преформируйте базу данных для чтения, когда вы хотите получить полноценный объект ORM, и сохраняйте объект ORM только в ограниченном объеме, чтобы он мог быть собран мусором, когда вы закончили с ним. Это, вероятно, сэкономит вам память.

У этого побочного эффекта также ограничение количества времени, в течение которого вам нужно открытое заседание. Так как вы можете открывать сессии (я бы рекомендовал фабрику сессий) и закрывать их по мере необходимости. Тем не менее, я думаю, что для открытия и закрытия сессий может быть значительный удар по базе данных (я думаю, что основная транзакция - настоящая проблема). Возможно, вы захотите взглянуть на JPA, который, насколько я понимаю, не нуждается в транзакции для чтения. В Spring также есть несколько приятных функций для автоматизации управления транзакциями и сеансами, которые они могут захотеть исследовать.

0 голосов
/ 18 мая 2009

Самая распространенная причина LazyInitializationException в том, что сеанс гибернации закрыт. Держите сеанс гибернации открытым, и все будет в порядке.

Обратите внимание, что если вы используете Spring HibernateTemplate для загрузки объектов, загружаемые вами объекты обязательно будут отсоединены. Если вы создаете веб-приложение с использованием Spring MVC, простой способ для этого - использовать OpenSessionInViewInterceptor .

0 голосов
/ 18 мая 2009

Возможно, вы уже закрыли сессию. Старайтесь держать сеанс открытым, когда данные загружаются с отложенной загрузкой или, если это невозможно, выполните активную загрузку, указав в коллекции атрибут lazy = "false" (по умолчанию используется значение lazy = "true").

...