Использование управления сеансами В спящем режиме в приложении Swing

Поскольку вы сделали git add, в Git все еще должны быть объекты BLOB для ваших измененных файлов во внутренних структурах, хотя и без их имен файлов. Есть способы восстановить их, но это потребует некоторого терпения и судебной работы с вашей стороны, связывая капли с тем, к какому файлу они принадлежат.

Внутреннее хранение объектов Git описано здесь: https://git-scm.com/book/en/v2/Git-Internals-Git-Objects

. может восстановить ваши измененные файлы с помощью git-recovery: https://github.com/ethomson/git-recover

Обсуждение этого другого, но связанного с этим вопроса также может помочь: [113 ] Что произойдет, если я прерву команду git add?

7
задан Dema 6 November 2008 в 13:17
поделиться

4 ответа

Единственная сессия. Запустите транзакцию, когда необходимо сделать ряд операций (как данные обновления после кнопки OK диалогового окна), фиксируйте tx в конце. Соединение, хотя постоянно открыто (так как это - та же сессия), и таким образом все возможности для кэширования может использоваться и Hib и RDBMS.

Это может также быть хорошая идея реализовать прозрачную сессию, вновь открылись в случае, если соединение пошло мертвое - пользователи склонны оставлять приложения открытыми в течение длительных промежутков времени, и это должно продолжить работать в понедельник, даже если бы сервер БД был перезагружен в выходные.

Обновление

Jens Schauder обеспечил причину использовать несколько сессий: частичные (нежелательные) обновления сессии. Ну, это сводится к способу, которым Вы используете, в спящем режиме.

Предположим, что у нас есть два открытые диалоговых окна (как в примере блога Jens). Если пользователь нажимает radiobox, и мы сразу обновляем Быть в спящем режиме объект, связанный с этим radiobox, то, когда пользователь нажимает Cancel, мы в беде - сессия уже обновляется.

Правильный путь, поскольку я вижу его, состоит в том, чтобы обновить диалоговые переменные (не будьте в спящем режиме объекты), только. Затем когда пользователь нажимает "OK", мы начинаем транзакцию, слияние обновило объекты, фиксируйте транзакцию. Никакой мусор никогда не сохраняется в сессию.

MyHibernateUtils.begin();
Settings settings = DaoSettings.load();
// update setttings here
DaoSettings.save(settings);
MyHibernateUtils.commit(); 

Если мы реализуем такое чистое разделение проблем, мы можем позже переключить на несколько сессий с простым изменением MyHibernateUtils.begin () реализацию.

Что касается возможной утечки памяти, хорошо... Transaction.commit () называет Session.flush (), какой AFAIK, чистит кэш также. Кроме того, можно вручную управлять кэширующейся политикой путем вызова Session.setCacheMode ().

10
ответ дан 6 December 2019 в 10:04
поделиться

Проблемой с "''сессией на поток''" являются хорошие приложения Swing, делают доступ к базе данных вне EDT, обычно в недавно созданных потоках SwingWorker. Таким образом, "''сессия на поток''" быстро становится "''сессией на щелчок''".

4
ответ дан 6 December 2019 в 10:04
поделиться

Не используйте единственную сессию. Для всего кроме наименьших приложений это вырастет, собирая устаревшие данные и станет медленнее и медленнее, так как грязная проверка должна проверить каждый объект в сессию.

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

Но если Вы хотите извлечь выгоду из питания, в спящем режиме, используют подход, который я описал в своем блоге: http://blog.schauderhaft.de/2008/09/28/hibernate-sessions-in-two-tier-rich-client-applications/

или в немецкой версии:

http://blog.schauderhaft.de/2007/12/17/hibernate-sessions-in-fat-client-anwendungen/

AFAIK это - действительно тот же подход, описанный в http://in.relation.to/Bloggers/HibernateAndSwingDemoApp, но с рекомендацией, как на самом деле определить объем Вашей сессии: На Сессии на Кадр, за исключением модальных Кадров, которые используют сессию родительского Кадра.

Просто удостоверьтесь, что никогда не объединили объекты от различных сессий. Это доставит много неприятностей.

В ответ на обновление Vladimirs:

  • Отмена на самом деле работает чрезвычайно любезная с моим подходом: выбросьте сессию.
  • session.flush не решает проблему постоянно растущей сессии, когда Вы работаете с единственной сессией для приложения. Конечно, с подходом, Вы описываете Вас, может работать с недолгими сессиями, которые должны работать хорошо. НО
  • Вы проигрываете много: ленивый загружающийся только работает с приложенными объектами, автоматическим обнаружением грязных объектов. Если Вы работаете с отделенными объектами (или объекты, которые не являются объектами вообще), необходимо сделать это сами.
4
ответ дан 6 December 2019 в 10:04
поделиться

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

1
ответ дан 6 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: