|
|
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Всем привет. Использую hibernate. Есть метод в котором происходит простое чтение объекта: Код: java 1. 2. 3. 4. При выборе объекта он переходит в персистентное состояние, далее сетится имя и без явного save выходим из метода. В этот момент срабатывает dirty checking и флашит данные в базу. Как можно обойти подобное поведение? Установка flush в manual не помогает. Ставить над каждым методом readOnly = true? Можно ли отключить механизм dirty checking-а? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 11:42 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
JulTКак можно обойти подобное поведение? Есть предложение не обходить функциональностью, а пользоваться ей. Если вам нужно отсоединить сущность от сессии, есть Session.evict(), например. JulTУстановка flush в manual не помогает. Полагаю что вы ошиблись где-то в тесте. JulTСтавить над каждым методом readOnly = true? Вообще это хорошая практика для read only транзакций. Производительность можно улучшить значительно. Не обязательно ставить на все методы. Только на читающие. JulTМожно ли отключить механизм dirty checking-а? Спасибо Вроде нет: https://hibernate.atlassian.net/browse/HHH-1041 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 12:45 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
JulTи без явного save выходим из метода. В этот момент срабатывает dirty checking и флашит данные в базу. странно. В базу пишется только при закрытии сессии хибера или при команде от вас в коде (update т .д.). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 13:13 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Petro123В базу пишется только при закрытии сессии хибера или при команде от вас в коде (update т .д.). При декларативном управлении транзакциями, сессия и транзакция через AOP привязываются к методу. Выход из метода закрывает сессию. Пора бы уже начать использовать Spring или хотя бы JEE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 13:22 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПора бы уже начать использовать Spring или хотя бы JEE. Ты прав)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 13:23 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, а почему у него тогда нет аннотаций над методом? Это же тогда ключевые вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 13:25 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Petro123а почему у него тогда нет аннотаций над методом? Это же тогда ключевые вещи. У неё. Ну, нет и нет. Метод выдуманный. Проблема понятна и без аннотации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 13:26 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, огромное спасибо за ответы. Если я правильно поняла, то механизм dirty checking-а срабатывает всегда, кроме случаев, когда: a) метод помечен аннотацией @Transactional с флагом readOnly = true б) flushMode = MANUAL Если readOnly=false на операцию чтения, то механизм dirty checking-а сработает в любом случае? Т.е., интересует в этом случае, на что хибер будет тратить время и почему это бъет по производительности. На сравнение сущности в момент загрузки и в момент выхода из метода и закрытия сессии? При установке flushMode в MANUAL флаг readOnly игнорируется? И еще хотелось бы узнать про транзакции. Зависит ли срабатываение механизма dirty checking-а от того, помечен метод аннотацией @Transactional (без переопределения флага readOnly) или нет? Как известно, если над методом не стоит аннотация @Transactional, при входе в метод запускается локальная транзакция, т.е. транзакция БД, правильно? В этом случае при выходе из метода происходит автоматический коммит? Очень хочется узнать суть происходящего под капотом. Простите за сумбур Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 10:53 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
JulT, если вы по факту пишите в объект, то почему вас так волнует readOnly? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 11:06 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Petro123JulT, если вы по факту пишите в объект, то почему вас так волнует readOnly? согласна, но человеческий фактор еще никто не отменял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 11:25 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
JulTсогласна, но человеческий фактор еще никто не отменял согласен, но согласитесь, что так писать странно)) и глюкаво) Как вариант: - @Transactional с флагом readOnly просит спринг (прогер поставил) - спринг просит ОРМ значит спринг просит хибер - хибер САМ ставит FlushMode.NEVER в ТЕКУЩЕЙ сессии - ваше p.setName("some name"); не будет сброшено в базу и пойдут глюки. зы Это минусы нашего AOP, несмотря на все наши плюсы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 11:36 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
JulTЕсли я правильно поняла, то механизм dirty checking-а срабатывает всегда, кроме случаев, когда: a) метод помечен аннотацией @Transactional с флагом readOnly = true б) flushMode = MANUAL Нет. б) отключает dirty checking, а a) включает б) JulTЕсли readOnly=false на операцию чтения, то механизм dirty checking-а сработает в любом случае? Может не сработать, если Хибер не сумеет инструментировать сущность чтобы перехватить изменения свойств. JulTПри установке flushMode в MANUAL флаг readOnly игнорируется? Вы путаете ORM и управление транзакциями. Это две разных штуки. А вы их мешаете в кучу только потому что у вашего контейнера есть интеграция с ORM. JulTЗависит ли срабатываение механизма dirty checking-а от того, помечен метод аннотацией @Transactional (без переопределения флага readOnly) или нет? Как известно, если над методом не стоит аннотация @Transactional, при входе в метод запускается локальная транзакция, т.е. транзакция БД, правильно? В этом случае при выходе из метода происходит автоматический коммит? Очень хочется узнать суть происходящего под капотом. Простите за сумбур А ещё "локальность" транзакции тут тоже не при чем. Это антоним для XA транзакции. Вы много всего намешали в один вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 11:48 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
JulTВсем привет. Использую hibernate. Есть метод в котором происходит простое чтение объекта: Код: java 1. 2. 3. 4. 1. после сеттера это уже не простое чтение объекта напр. из кеша. 2. Если у вас не академический интерес, то не меняйте стратегию flush у хибера по умолчанию. Разбирайтесь с транзакциями спринга уровнем выше. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 12:01 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Советую почитать https://www.ibm.com/developerworks/ru/library/j-ts1/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 20:57 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Тем не менее, для меня не совсем понятен один момент. Если мы сделаем внутри транзакции сервлета: Код: java 1. 2. 3. 4. Ничего не изменится. Но если сделаем тоже самое внутри EJB, то неявно будет выполнен persist? В чем логика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 21:05 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Во втором случае метод выглядит так: Код: java 1. 2. 3. 4. 5. 6. 7. Вроде как в первом и втором случае мы явно выполнили одно и тоже внутри транзакции. Но во втором был вызван persist? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 21:06 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczPetro123а почему у него тогда нет аннотаций над методом? Это же тогда ключевые вещи. У неё. Ну, нет и нет. Метод выдуманный. Проблема понятна и без аннотации. Оно и без аннотаций по дефолту TransactionAttributeType.REQUIRED ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 21:18 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Hett, Что за код с двойным стартом транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 23:15 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Где двойной старт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2017, 09:14 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
А, да это когда сюда копировал ошибся. Там коммит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2017, 09:24 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
без EJB нужно работать с сессией ОРМ-хибером. Закрыввать и открывать. Hett Код: java 1. 2. 3. 4. 5. кому что нравится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2017, 10:03 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
HettЕсли мы сделаем внутри транзакции сервлета: у сервлета нет транзакции. Намешаны технологии. Без EJB транзакция по поростому приравнивается к сессии хибера. Одно без другого не имеет смысла, т.к. они очень короткие и объекты живут от первой строчки сервлета до последней строчки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2017, 10:16 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Я ошибся вчера видимо, в обоих случаях объект сохраняется без явного вызова persist или т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2017, 12:12 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
Petro123HettЕсли мы сделаем внутри транзакции сервлета: у сервлета нет транзакции. Намешаны технологии. Без EJB транзакция по поростому приравнивается к сессии хибера. Одно без другого не имеет смысла, т.к. они очень короткие и объекты живут от первой строчки сервлета до последней строчки. Транзакция это транзакция, естественно она не может существовать вне сессии. Сессии есть у entityManager`a, приспокойно можно делать запросы на чтение, но транзакциями он не обеспечивает, и персист уже сделать не получится без явного или не явного использования транзакций. Код: java 1. Что это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2017, 12:16 |
|
||
|
dirty checking, flush и т.д.
|
|||
|---|---|---|---|
|
#18+
HettЧто это? псевдокод. Просто своя обёртка-код. В интернете встречается как HibernateUtil.java Код: java 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. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2017, 13:00 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39441565&tid=2122960]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
78ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
86ms |
get tp. blocked users: |
2ms |
| others: | 224ms |
| total: | 444ms |

| 0 / 0 |
