|
|
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
По другому не назвать. Суть: Есть веб приложение. Сидят две тётки и шпарят заказы - сначала забивается и сохраняется шапка, потом позиции. В какойто момент у одной из теток валится эксцепшн, и если в этот момент вторая тетка добавляла позицию - она видит перед собой документ который сделала первая тётка... Пробовали дебажить - повторить ошибку так и не смогли. В логах лежит НулПоинтер эксцепшн но строки на которые он указывает а) разные; б) там хтмл. Методы записи и чтения - синхронизированы. Думалось про Юзера, данные которого фигурируют в параметрах метода при сохранении и берутся из сессии, но сессия в порядке. Мож кто сталкивался с такой бородой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 17:39:26 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
Похоже на ошибку уровня доступа к БД. Судя по всему транзакицонность не знакомое проекту понятие. Первая тетка вносит данные, получает ошибку но транзакция не откатывается. Вторая тетка сохраняет, и вместо получения своей записи из базы получает последнюю внесенную запись. Вопрос к Java не имеет никакого отношения. Грабли с вероятностью 99.9% в проекте. Без раскрытия кода и описания способа контроля многопоточности вопрос решить не возможно. Фраза "Методы записи и чтения - синхронизированы" пугает окончательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 17:45:20 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
Если бы дело было только в записи. Возвращается заказ целиком, тетке которая его не делала. При этом в таблице присутствуют оба заказа с позициями и шапками которые забивали соответствующие тётки. Авторство тоже соответствует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 17:49:56 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
Без деталей реализации дальнейшее обсуждение смысла не имеет. Ни тетки, ни записи, ни шапки, ни таблички, не имеют к Java никакого отношения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 17:51:36 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
Читаем Код: 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. Сохраняем Код: 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. из сервлета вызывается int x = xx.saveOHeader(...) по условию. Хз шо еще необходимо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 18:02:22 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
Vincent FROSTМетоды записи и чтения - синхронизированы. Жжесть. Vincent FROSTлежит НулПоинтер эксцепшн но строки на которые он указывает а) разные; б) там хтмл. давай стектрейс + релевантный код. про б) нипонял. Vincent FROSTПо другому не назвать Чудес не бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 18:23:22 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
"Плохи Ваши дела, товарищь призывник." Синхронизация отдельных методов никак не гарантирует целостности данных в БД. Изучите что такое транзакции БД и транзакции бизнес логики. Если проект большой и он весь так написан - мои Вам соболезнования. Первое чем стоит занятся это накатить транзакции на бизнес операции. К примеру, есть одна операция "тетка сохраняет данные", она в коде превращается к пачке обращений к БД - сохранить шапку - сохранить записи - сохранить ещё чего-нить Так вот все обрщения к БД для одной бизнес-операции очень желательно выполнять в одной изолированой транзакции. Тогда можно как минимум гарантировать что разные тетки работая в разных транзакциях одновременно не насрут друг другу. Это с точки зрения базы. Могу быть и другие критичные ресурсы. В общем надо много и настойчиво изучать многопоточность. В системах с большой многопоточной нагрузкой даже бывалые девелоперы натыкаются на мистику которой вашим теткам и не снилось. Что уж говорить о проектах с приведенным выше кодом. Там мистика многопоточности будет частым гостем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 18:38:54 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
Vincent FROSTлежит НулПоинтер эксцепшн но строки на которые он указывает а) разные; б) там хтмл. давай стектрейс + релевантный код. про б) нипонял. Про б). at org.apache.jsp.orders_jsp._jspService(orders_jsp.java:173) тут кроме хтмла нифига нет. Страница собирается из нескольких инклюдов. Вариант тока если собирать страницу без включений и пытаться воспроизвести ошибку, что не есть возможно на данный момент. Если убрать всю разметку то остаётся следующее: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: 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. Vincent FROSTПо другому не назвать Чудес не бывает. Согласен. Сам до сих пор не верю шо такое может быть ибо своими глазами пока не видел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 18:49:49 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
Vincent FROSTСогласен. Сам до сих пор не верю шо такое может быть ибо своими глазами пока не видел. Welcome to multithreaded world! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 18:57:59 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
Blazkowicz"Плохи Ваши дела, товарищь призывник." Синхронизация отдельных методов никак не гарантирует целостности данных в БД. Изучите что такое транзакции БД и транзакции бизнес логики. Если проект большой и он весь так написан - мои Вам соболезнования. Первое чем стоит занятся это накатить транзакции на бизнес операции. К примеру, есть одна операция "тетка сохраняет данные", она в коде превращается к пачке обращений к БД - сохранить шапку - сохранить записи - сохранить ещё чего-нить Так вот все обрщения к БД для одной бизнес-операции очень желательно выполнять в одной изолированой транзакции. Тогда можно как минимум гарантировать что разные тетки работая в разных транзакциях одновременно не насрут друг другу. Это с точки зрения базы. Могу быть и другие критичные ресурсы. В общем надо много и настойчиво изучать многопоточность. В системах с большой многопоточной нагрузкой даже бывалые девелоперы натыкаются на мистику которой вашим теткам и не снилось. Что уж говорить о проектах с приведенным выше кодом. Там мистика многопоточности будет частым гостем. Есть мнение, шо не все были рождены гениями, более того - не все смотрят на одни и теже вещи под одним и тем же ракурсом. До кучи, они еще и информацию воспринимают по разному... Про многопоточность - согласен. В виду того, шо это по сути первый проект который делается на жабе - всё еще впереди. На данный момент хочется получить рабочий кусок кода который не будет есть моск, после чего сесть и заняться литературоведением и гуглеползанием с целью выяснения почему и как. В текущей ситуации смущает только то, что а) ошибку не повторить на девелоперской машине; б) неясны условия возникновения ситуации которая приводит к ошибке. Из того, что просится с ходу на ум - теряется сессия в которой лежит идентификатор заказа. А вот на вопрос почему - ответа пока ненашол. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 19:02:45 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
BlazkowiczWelcome to multithreaded world! Ага, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 19:03:46 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
Vincent FROSTЕсть мнение, шо не все были рождены гениями, более того - не все смотрят на одни и теже вещи под одним и тем же ракурсом. До кучи, они еще и информацию воспринимают по разному... Верю, поэтому так все детально расписал, а не послал в RTFM. Начни с изучения понятия транзакция, зачем оно надо, и как оно помогает в сохранении целостности данных. Vincent FROSTПро многопоточность - согласен. В виду того, шо это по сути первый проект который делается на жабе - всё еще впереди. На данный момент хочется получить рабочий кусок кода который не будет есть моск, после чего сесть и заняться литературоведением и гуглеползанием с целью выяснения почему и как. Из показанного рабочий кусок кода получить сложно. Столько всяких советов, хочется надавать. Но не буду. Опять нарвусь на грубость. Vincent FROSTВ текущей ситуации смущает только то, что а) ошибку не повторить на девелоперской машине; Ошибки многопоточности вообще повторить не реально почти в 90% случаев. Только дать нужную нагрузку на сервер тестами и смотреть весело на все новые и новые исключения. Vincent FROST б) неясны условия возникновения ситуации которая приводит к ошибке. Из того, что просится с ходу на ум - теряется сессия в которой лежит идентификатор заказа. А вот на вопрос почему - ответа пока ненашол. "Теряется сессия" - очень похоже на желание обвинить кого-нибудь ещё в своих ошибках. Никто ни куда сам по сете не теряется. Проанализируйте откуда берется xOID и каким образом он может принимать не верные значения. И уберите к черту synchronized, он Ваш код совсем не лечит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 19:45:07 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Vincent FROSTЕсть мнение, шо не все были рождены гениями, более того - не все смотрят на одни и теже вещи под одним и тем же ракурсом. До кучи, они еще и информацию воспринимают по разному... Верю, поэтому так все детально расписал, а не послал в RTFM. Начни с изучения понятия транзакция, зачем оно надо, и как оно помогает в сохранении целостности данных. Vincent FROSTПро многопоточность - согласен. В виду того, шо это по сути первый проект который делается на жабе - всё еще впереди. На данный момент хочется получить рабочий кусок кода который не будет есть моск, после чего сесть и заняться литературоведением и гуглеползанием с целью выяснения почему и как. Из показанного рабочий кусок кода получить сложно. Столько всяких советов, хочется надавать. Но не буду. Опять нарвусь на грубость. Vincent FROSTВ текущей ситуации смущает только то, что а) ошибку не повторить на девелоперской машине; Ошибки многопоточности вообще повторить не реально почти в 90% случаев. Только дать нужную нагрузку на сервер тестами и смотреть весело на все новые и новые исключения. Vincent FROST б) неясны условия возникновения ситуации которая приводит к ошибке. Из того, что просится с ходу на ум - теряется сессия в которой лежит идентификатор заказа. А вот на вопрос почему - ответа пока ненашол. "Теряется сессия" - очень похоже на желание обвинить кого-нибудь ещё в своих ошибках. Никто ни куда сам по сете не теряется. Проанализируйте откуда берется xOID и каким образом он может принимать не верные значения. И уберите к черту synchronized, он Ваш код совсем не лечит. Про грубость несовсем понял. Если мой пост можно считать "накатом" - примите мои извинения, ибо не хотел быть грубым, и более того, даже в мыслях небыло, что мои слова можно трактовать именно таким образом. Про теряется сессиия... отнють, даже не пытался обвинять. Просто указал на одну из причин. xOID берется из реквеста куда попадает с формы и держится пока документ не сохранен. Проверю еще раз логику с учётом замечаний. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 20:02:08 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
Vincent FROSTПро грубость несовсем понял. Если мой пост можно считать "накатом" - примите мои извинения, ибо не хотел быть грубым, и более того, даже в мыслях небыло, что мои слова можно трактовать именно таким образом. Да, не про тебя конкретно. Просто вот такое частый случай, когда пытаешься слишком много наводок дать. Поэтому даже не заикаюсь про потенциальный SQL Injection и PreparedStatement. Vincent FROSTПро теряется сессиия... отнють, даже не пытался обвинять. Просто указал на одну из причин. xOID берется из реквеста куда попадает с формы и держится пока документ не сохранен. Проверю еще раз логику с учётом замечаний. Если используется контейнер сервлетов не 10ти летней давности, то сессия никуда не теряется. Максимум она может заэкспарится по таймауту. Но тогда все равно не ясно откуда берется id другой записи другого пользхователя. Вообще список можно придумать довольно длинный, попробую на вскидку - все таки операции с БД где-то не верно работают. Мне это кажется наиболее вероятным. - поля в классах-сервлетах - любые статические поля в приложения - ThreadLocal, если из него забывают удалять значение, потому как зачастую поток берется из пула. Хотя в этом варианте я очень сомневаюсь, судя по коду. - различного вида кэши, но это тоже маловероятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2007, 12:32:23 |
|
||
|
Полтергейст
|
|||
|---|---|---|---|
|
#18+
Vincent FROST...На данный момент хочется получить рабочий кусок кода который не будет есть моск, после чего сесть и заняться литературоведением и гуглеползанием с целью выяснения почему и как Лучше вначале подумать(изучить вопрос, почитать литературу), а потом сделать правильно, а если нужны работающие примеры для понимания принципов,то лучше брать их из литературы, а то потом можно дого полтергейстов искать. ЗЫ Если долго работать программистом начинаешь понимать, что чудес и полтергейста нет, а есть суеверия, незнания и ситуация, когда сам где-то, что-то не додумал. Или(как правило намного реже для начинающих программистов) когда кто-то написал кривизну, которую ты пытаешься использовать в своем коде :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2007, 14:19:31 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=34812901&tid=2144564]: |
0ms |
get settings: |
18ms |
get forum list: |
27ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
48ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
| others: | 336ms |
| total: | 540ms |

| 0 / 0 |
