|
|
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Добрый день, есть задача: Открываю сессию с hibernate, начинаю транзакцию, создаю 2 объекта и делаю им save. session = factory.openSession(); session.setFlushMode(FlushMode.MANUAL); session.beginTransaction(); MObject obj1 = new MObject(); MObject obj2 = new MObject(); session.saveOrUpdate(obj1); session.saveOrUpdate(obj2); Далее мне бы очень бы хотелось сразу получить этих 2 сохраненных объекта запросом: List list = session.createQuery("from Mobject").list(); как результат лист не содержит данных ну или вновь добавленных объектов. Уточню, что мне по задаче нельзя до запроса сделать автоматический или ручной сброс данных в базу( session.flush(); ). Возникают следующие вопросы: можно ли в данном случаи получить запросом объекты которые созданы и находятся в памяти сессии без сброса их в базу? Если можно, то как? Ну или возможно есть какие-то хитрые пути для того чтоб их получить из сессии, по идентификатору дергать нельзя. А также сопутствующий вопрос, а если наоборот я удалю из выборки 2 объекта, как сделать так чтоб при новом запросе, они не попали в эту выборку? Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 02:31:11 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyУточню, что мне по задаче нельзя до запроса сделать автоматический или ручной сброс данных в базу(session.flush();).Вот отсюда ноги проблемы и растут. Почему нельзя? Дело в том, что у вас сначала MObject'ы сначала сохраняются в кеше первого уровня, а отправляя запрос вы его обходите - там работает уже Query Cache. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 10:12:00 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Нельзя потому что используется «долгая» операция(диалоги) с открытой сессией hibernate между запросами от пользователя, в конце запроса session.disconnect() в начале следующего session.reconnect() чтобы не держать jdbc соединение. Ну и по завершению диалога либо session.flush() либо откат Поэтому сбрасывать в базу не могу ибо потом все эти действия могут быть отменены. А вот в процессе работы видеть предварительно добавленные объекты при последующей выборки в этой же сессии или наоборот если что-то было удалено из выборки, а затем снова сделали запрос, то следовательно не получать эти объекты в список мне как раз и надо. Может можно это как-то на кэше запросов сделать или еще каким-нибудь способом? Просто очень не хочется изобретать велосипед, ну а если и изобретать то хоть по правильному с надеждой на стабильную и быструю работу в дальнейшем) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 10:27:43 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyПоэтому сбрасывать в базу не могу ибо потом все эти действия могут быть отменены. противоречие. Выберите 2 модели в хибере: - длинные транзакции - пишите в БД и никто до коммита не увидит ваше творчество. В конце дня сделаете rollback - короткие... Я так понял что у вас п.1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 10:32:50 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123slipperyПоэтому сбрасывать в базу не могу ибо потом все эти действия могут быть отменены. противоречие. Выберите 2 модели в хибере: - длинные транзакции - пишите в БД и никто до коммита не увидит ваше творчество. В конце дня сделаете rollback - короткие... Я так понял что у вас п.1? Хм....насколько я понимаю как раз держать длинную транзакцию в многопользовательском приложении ну очень накладно и вредно. Поэтому я держу открытой сессию, на время простоя пока пользователь набивает данные хочу отпускать соединение сессии с jdbc путем session.disconnect(). когда пользователь вносит очередную правку я подключаю сессию с помощью реконекта, открываю транзакцию выполняю действия и закрываю транзакци. и снова отключаю сессию. Но при всем этом не сбрасываю данные из сессии в саму БД. Проблема встает в том, что пользователь к примеру добавил 2 новых объекта в список, затем нажал кнопку «обновить» список по которой выполняется выборка и новые добавленные объекты естественно не появились. Хотя они дабавлены и сессия о них знает. Тут я упрощенно конечно пример привел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 10:42:09 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyи снова отключаю сессию. Но при всем этом не сбрасываю данные из сессии в саму БД. ну и почему не отправить в БД в конце РАБОТЫ, т.е. окончания БИЗНЕС-транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 10:50:09 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyХм....насколько я понимаю как раз держать длинную транзакцию в многопользовательском приложении ну очень накладно и вредно вредно курить, но есть ньюансы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 10:50:45 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
ещё вариант отключить 2-ой кэш. Т.к. он не всегда нужен. (вам виднее) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 10:51:57 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Простой пример: есть заказчик есть заказы, пользователь открыл форму с конкретным заказчиком, форма из 2х вкладок. На первой инфа по заказчику, на второй список его заказов. Список заказов к примеру большой и выгружается постранично(по 20 заказов за раз). Так вот пользователь к примеру удалил пару заказов ненужных, а 1 новый добавил, загрузил вторую порцию заказов(следующие 20), потом вернулся к первой, а ничего не изменилось для него, то есть в списке снова присутствуют удаленные заказы и нет добавленных. В самой сессии то данные об этом есть и при сбросе в базу(конечное подтверждение операции), все запишется, но на внешний вид пользователю кажется, что система не работает. Контролировать это руками даже не знаю как правильно, так как надо сделать универсальный метод работы для всех подобных форм и объектов в системе. Хотелось чтобы по максимальному все было бы автоматически, ну или какое-то хитрое решение данной задачи придумать. насчет кэша второго уровня не совсем понял, он у меня и не включен..... насчет вреда 1 большой транзакции...редактирование может и часы занимать и насколько я понимаю это очень сильно ударит по нагрузке, когда одновременно работающих пользователей будет не 10 и не 100. а по требованию которые мне выставлены, нужно сделать с учетом что их будет в разы больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 10:58:15 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyХотелось чтобы по максимальному все было бы автоматически 2 варианта: - найти точно такую тему, там решение svenom с каскадами - режим длинных транзакции (меньше писанины, до ~ 1000 - 10000 клиентов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 11:04:31 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123slipperyи снова отключаю сессию. Но при всем этом не сбрасываю данные из сессии в саму БД. ну и почему не отправить в БД в конце РАБОТЫ, т.е. окончания БИЗНЕС-транзакции? потому что работа будет закончена после редактирования всех нужных данных, я привел пример формы из 2х вкладок в реале их сейчас уже бывает под 6 штук и эта бизнес операция реально может занимать часы, причем в самом конце пользователь может передумать и нажать откат всей операции. если сохранять промежуточные данные в базу все время то надо как-то помечать объекты, что "временные" пока не подтвердили операцию окончательно, другим пользователям не давать их читать как будто их нет(а значит все выборки дополнят условиями), сборщик мусора и все дела...много гемора, хотелось бы все сделать не так жестко ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 11:06:03 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123slipperyХотелось чтобы по максимальному все было бы автоматически 2 варианта: - найти точно такую тему, там решение svenom с каскадами - режим длинных транзакции (меньше писанины, до ~ 1000 - 10000 клиентов) не совсем понимаю причем тут каскады? ведь вполне может быть так что именно "заказчик" не будет иметь OneToMany на заказы, а заказы односторонне будут иметь ManyToOne. а что там еще было в той теме, чтоб было легче найти? а есть какие-нибудь данные по нагрузке при длинных транзакций, к примеру это же будет в пуле открыто очень много соединений с базой(столько сколько параллельно пользователей ведет работу с такими формами), а каждое из них жрет память, даже с оперативкой встанут вопросы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 11:10:23 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyPetro123пропущено... ну и почему не отправить в БД в конце РАБОТЫ, т.е. окончания БИЗНЕС-транзакции? потому что работа будет закончена после редактирования всех нужных данных, я привел пример формы из 2х вкладок в реале их сейчас уже бывает под 6 штук и эта бизнес операция реально может занимать часы, причем в самом конце пользователь может передумать и нажать откат всей операции. ===== вы не поняли. Бизнес-транзакция\Хибер\БД-транцакции - это всё разные вещи. Бизнес, это кнопка у пользователя либо крест на форме. если сохранять промежуточные данные в базу все время то надо как-то помечать объекты, что "временные" пока не подтвердили операцию окончательно, другим пользователям не давать их читать как будто их нет(а значит все выборки дополнят условиями), сборщик мусора и все дела...много гемора, хотелось бы все сделать не так жестко ======= при длинных НИЧЕГО этого не надо. Следит БД и его уровень изоляции транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 11:13:25 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyа что там еще было в той теме, чтоб было легче найти? свою же тему? ЭТО твоя тема "интересная задача" :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 11:17:41 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
при длинных транзакциях, я понимаю все будет работать, но пугает сколько потребуется ресурсов, просто через какое-то время уже работы системы увидеть, что она жутко тормозит будет очень не приятно, возможно я конечно ошибаюсь насчет затраченных ресурсов.. просто смотрю вот на процессы, пул держит сейчас 15 открытых коннектов к БД, каждый из них жрет памяти по 300 мегабайт, а если открыто сразу 10000??? про тему, скорее всего я понял о какой вы говорите, я наверно ее и задавал перед отпуском, я оттуда подчерпнул для себя, но не все...вот проблема с добавляемыми элементами как я выше писал осталась) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 11:22:02 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123slipperyа что там еще было в той теме, чтоб было легче найти? свою же тему? ЭТО твоя тема "интересная задача" :)) ага, уже увидел))) я оттуда уже взял пару подходов, ушел в отпуск, сейчас вернулся и вот с добавляемыми элементами столкнулся) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 11:23:00 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyага, уже увидел))) вот народ, мусолят одну тему - потом во второй по новой, причём без ссылок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 11:28:20 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenom писал что: "Если вы делаете SELECT/DELETE/SELECT в рамках одной сессии, то Хибер все сделает за вас автоматом." а если SELECT/SAVE/SELECT в рамках одной сессии, такое не получится? именно в этом и стоит мой главный вопрос с учетом того что заказчик "заказчик" не будет иметь OneToMany на заказы, а заказы односторонне будут иметь ManyToOne. Большое спасибо вам за ответы, в прошлой теме многое для себя узнал и в этой узнаю, еще раз спасибо!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 11:31:04 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123slipperyага, уже увидел))) вот народ, мусолят одну тему - потом во второй по новой, причём без ссылок. да что-то не подумал, видать после НГ праздников голова думать еще не начала) извиняюсь ссылка: /topic/905874&hl= ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 11:32:36 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slippery, Удачи! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 12:08:31 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123slippery, Удачи! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. насколько я понял по документации есть и 3 путь! "Кроме того, вы можете предпочесть использовать одну сессию, которая охватывает несколько запросов вашей транзакции приложения. В этом случае, вам не нужно беспокоиться о присоединении несвязанных объектов, так как объекты остаются хранимыми в рамках одной длительной сессии Сессия сериализуемая и может быть безопасно сохранена, например, в сервлете HttpSession. Конечно, базовое JDBC соединение должно быть закрыто и новое соединение должно быть получено на следующий запрос. Вы используете методы disconnect() и reconnect() интерфейса сессии для того, чтобы освободить соединение и затем получать новое соединение. Такое подход известен, как сессия-на-транзакцию-приложения или длинная сессия." Вот именно 3 вариант меня и привлек, а какие тут минусы. Да естественно объект заказчик мы блокируем при редактировании. НО вот заказы блокировать уже не надо. Так вот именно в этом 3 варианте будут ли работать: 1) SELECT/DELETE/SELECT в рамках одной сессии? 2) SELECT/SAVE/SELECT в рамках одной сессии? первое проверить не успел, еще не был за компом где есть проект, а вот второе не работает, либо я не так это делаю....именно в этих двух вопросах и заключается моя проблема. Да может если кто пробовал реализовывать 2(новую сессию и присоединять объекты) или 3(1 сессия которой делают коннект-реконет) вариант может сразу сказать какой лучше и чем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 16:44:21 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
авторПоэтому сбрасывать в базу не могу ибо потом все эти действия могут быть отменены. flush не комитит транзакцию. Делайте flush, а если надо будет отменить изменения, то вы всегда можете сделать rollback. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 20:52:38 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
С первого раза неправильно понял вопрос, поэтому предыдущее сообщение недействительно. Сейчас вникну еще раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 20:55:47 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyДа естественно объект заказчик мы блокируем при редактировании. НО вот заказы блокировать уже не надо это почему? Отдели БЛ от технической части. ВИ (прецендент): - бизнес-транзакция начинается с момента НЕ показа на экране Заказчик - его заказы, а на кнопку Редактировать. - заканчивается - крест\Сохранить\Отмена - при лог.блокировке, ты должен известить второго чела, что Иванов УЖЕ взял ДОКУМЕНТ заказчика на редактирование при Нажатии Петровым на кн. Редактировать. Если не блокировать заказы, то 2-3-10 менеджеров будут удалять один и тот же заказ № 15 у Заказчика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 09:50:48 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37610553&tid=2132841]: |
0ms |
get settings: |
14ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
360ms |
get topic data: |
16ms |
get forum data: |
4ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 336ms |
| total: | 828ms |

| 0 / 0 |
