|
|
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
Timm Blazkowicz Все верно, но стоит так же отметить что вынесение блокировок с уровня базы на уровень приолжения, довольно позитивно влияет на приложение в целом . Опечатался, хотел написать на производительность в целом. TimmТебе не повезло с СУБД "Везет" с СУБД только в том случае если она крутится в той же JVM. 8)) Во всех остальных большую часть времени приложения ждут ответа от JDBC. TimmЛюбое изменение БД влечет за собой некоторое блокирование на каком-то уровне. Когда сюда добавляется попытка организации блокировок на стороне апликейшна (опять же стоит вспоминить о кластере) возникает масса забавных ситуаций. Забавных ситуаций не избежать в любом приложении с серьезной нагрузкой, не зависимо от местонахождения локов. С кластеризацией-то можно все локи на базу перевести, но потом все равно перфоманс тюнить. TimmРаспределенный дедлок - что может быть лучше Кто его будет ресолвить? [нормальная ;)] СУБД сделает фсе сама. Ага. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2007, 18:24:50 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
ЧендлерПриходится разрабатывать веб интерфейс. Никогда ранее веб интерфейс при помощи jsp не писал. Архитектура система трёх уровневая (субд, сервер приложений, браузер). С какой стороны ко всему этому подходить? Как решить проблему с блокировкой данных, если пользователь начал редактировать чтото то другой пользователь не должен редактировать теже самые данные. Ка это можно сделать? еслибы интерфейс был гуишный то всё понятно - установил соединение, сделал селект фор апдейт и всё. Напиши две хранимых процедуры - блокировки и разблокирования, типа Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2007, 18:29:23 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
.................. А на форму редактирования таблиц добавь 2 кнопки внутри методов-обработчиков которых которые блокируются и разблокируются таблицы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2007, 18:36:28 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Timm Blazkowicz Все верно, но стоит так же отметить что вынесение блокировок с уровня базы на уровень приолжения, довольно позитивно влияет на приложение в целом . Опечатался, хотел написать на производительность в целом. Я понял что ты хотел сказать, мое мнение - блокировки в апликейшне при работе с БД очень сильно усложняют жисть. Видел последствия дедлока между БД и 4 нодами кластера, как раз из-за такой пакости. BlazkowiczЗабавных ситуаций не избежать в любом приложении с серьезной нагрузкой, не зависимо от местонахождения локов. С кластеризацией-то можно все локи на базу перевести, но потом все равно перфоманс тюнить. Когда приложение становится слишком большим, даже незначительное изменение дизайна влечет некоторые трудозатраты/импакт. Имхо, стратегия блокирования это не "небольшое изменение", поэтому выбор нужно делать на этапе дизайна, а никак не подгонять "когда прижмет". И снова: апликейшн - не лучший выбор для организации concurrency control. И чтобы не обсуждать "сферического коня в вакууме", приведи плиз пример "вынесение блокировок с уровня базы на уровень приолжения". Хочу видеть улучшение "производительности в целом" :) " потом все равно перфоманс тюнить" - это хреновая метода. No comments. Изя Шниперсон... Не советуй, пожалуйста, ерунду. За такой PL-код надо бить по рукам, к тому же проблему автора он решает только в одном случае - когда соединение хранится в сессии, а это бред. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2007, 18:53:34 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
TimmИ чтобы не обсуждать "сферического коня в вакууме", приведи плиз пример "вынесение блокировок с уровня базы на уровень приолжения". Хочу видеть улучшение "производительности в целом" :) Банально, версии хранить в кэше чтобы попытку записать можно было отшить ещё до обращения в базу. На счет пессимистичного лока пока в голову ничего не приходит. Хотя там тоже рапределенные варианты есть, надо подумать над примером. Timm" потом все равно перфоманс тюнить" - это хреновая метода. No comments. Тюнить сразу это не менее хреновая метода, которая называется "превентивная оптимизация". Никто не спорит что блокировки надо делать обдуманно. Но только всегда их делать только в базе мне не кажется разумным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2007, 19:25:59 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
Blazkowicz TimmИ чтобы не обсуждать "сферического коня в вакууме", приведи плиз пример "вынесение блокировок с уровня базы на уровень приолжения". Хочу видеть улучшение "производительности в целом" :) Банально, версии хранить в кэше чтобы попытку записать можно было отшить ещё до обращения в базу. На счет пессимистичного лока пока в голову ничего не приходит. Хотя там тоже рапределенные варианты есть, надо подумать над примером. Timm" потом все равно перфоманс тюнить" - это хреновая метода. No comments. Тюнить сразу это не менее хреновая метода, которая называется "превентивная оптимизация". Никто не спорит что блокировки надо делать обдуманно. Но только всегда их делать только в базе мне не кажется разумным. Timm кстати говорил не про "тюнить сразу", а про то что думать надо обо всех критичных вещах (к которым относится и методика обеспечения многопользовательского доступа и производительность и много других вещей) еще на этапе дизайна. Правильный дизайн зачастую как раз избавляет от необходимости долгой и упорной настройки производительности в дальнейшем, а когда не избавляет, то по крайней мере упрощает её. А вынос транзакционности полностью на уровень приложения имеет такой большой недостаток, как ограничение возможности работы с данными приложения только через само приложение. А это действительно большое ограничение. По поводу предлагаемого варианта с кэшем. В OLTP-системе затраты на поддержание данных в кэше в актуальном состоянии могут заметно снизить его полезность. В общем не будем забывать что кэширование наиболее эффективно для активно читаемых данных при сравнительно меньшей (относительно чтений) доле модификаций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2007, 23:37:40 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
давайте оставим в покое OLTP И кеширование на уровне приложения, пусть кеширует субд. Если имеется много приложений причём некоторые на Java(Swing,WEB), C#(GUI), Delphi(GUI) локи нужно делать в бд, на уровне строк. Самый прикол в том что структура табличек может меняться и приходится много переписывать. Так и не нашёл ничего подходящего, чую что придётся писать свой фрейм ворк. Осталось рассмотреть NetBeans, Spring. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 05:24:51 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
Чендлердавайте оставим в покое OLTP И кеширование на уровне приложения, пусть кеширует субд. Если имеется много приложений причём некоторые на Java(Swing,WEB), C#(GUI), Delphi(GUI) локи нужно делать в бд, на уровне строк. Самый прикол в том что структура табличек может меняться и приходится много переписывать. Так и не нашёл ничего подходящего, чую что придётся писать свой фрейм ворк. Осталось рассмотреть NetBeans, Spring.Самый прикол в том, что все бизнес-операции можно оборачивать в хранимые процедуры. И тогда для клиентского приложения, будь он хоть свинг, хоть си-шарп, будет существовать только вызов одной или нескольких хранимок, а уж при изменении структуры таблиц будет меняться лишь хранимка, но не вызов ее из клиента (если конечно структура не меняется настолько глобально, что просто невозможно сохранить совместимость). Этакая псевдо-трехзвенка, где вместо сервера приложения идет слой хранимых процедур и вьюшек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 11:49:45 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
Чендлердавайте оставим в покое OLTP И кеширование на уровне приложения, пусть кеширует субд. Если имеется много приложений причём некоторые на Java(Swing,WEB), C#(GUI), Delphi(GUI) локи нужно делать в бд, на уровне строк. Самый прикол в том что структура табличек может меняться и приходится много переписывать. Так и не нашёл ничего подходящего, чую что придётся писать свой фрейм ворк. Осталось рассмотреть NetBeans, Spring. Если меняется структура таблиц, то наверное меняется и бизнес-логика работы с этими данными ? В этом случае по любому надо будет что-то изменять/дописывать, разве нет ? Так ли уж надо сразу кидаться "писать свой фреймворк", может попробовать воспользоваться чужими наработками ? Самый быстрый способ сделать что-то - взять уже готовое ;-) Иногда кстати бывает полезно часть бизнес-логики вынести на сервер БД - когда она используется в нескольких приложениях или подсистемах неоднородного приложения. Бывает очень удобно, часто позволяет повысить производительность. Но, по своему опыту могу смело это утверждать, до определенного предела сложности. PL/SQL очень удобен, полезен и сильно упрощает жизнь при разработке под Oracle, но тем не менее (а) остается процедурным языком (б) нет для него такого огромного количества сторонних разработок на все случаи жизни, которыми можно было бы воспользоваться (в 95% случаев используются свои наработки + стандартные оракловые возможности, которых конечно достаточно чтобы можно было сделать всё что угодно, но ... вы пробовали писать на джаве использую только jdk ? его ведь тоже в принципе вполне достаточно). И я это очень хорошо прочуствовал после двух лет непрерывной разработки сложной, гибко кастомизируемой системы с нуля на чистом PL/SQL. Все успешно завершилось, но "осадочек то остался" ;-) PS Надеюсь никто не воспримет это как призыв не использовать хранимые процедуры ;) Как раз наоборот - применять для каждого случая тот инструмент, который к этому наиболее приспособлен. PPS Несколько раз сталкивался с обратной ситуацией - народ реализовывал сам функциональность БД. А БД использовал только как складбище данных. Тоже абсолютно ничего хорошего. Хм. Куда то я в сторону ушел. Сорри, наболело :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 11:57:32 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
TiGА вынос транзакционности полностью на уровень приложения имеет такой большой недостаток, как ограничение возможности работы с данными приложения только через само приложение. Я нигде не говорил про полный вынос локов в приложение. Я говорил что, вынося локи из базы, можно получать прирост производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 12:18:11 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
Blazkowicz TimmИ чтобы не обсуждать "сферического коня в вакууме", приведи плиз пример "вынесение блокировок с уровня базы на уровень приолжения". Хочу видеть улучшение "производительности в целом" :) Банально, версии хранить в кэше... ОК, отлично. Но нисколько не банально. Каким образом обеспечиваются, if any: 1. thread-safety 2. memory usage control 3. транзакционность данных при работе с этим кэшем? сколько их (кэшей) нужно? когда в него попадают данные? когда "пропадают"? про синхронизацию и кластер пока молчу. PS. примерчег кода будет очень кстати. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 12:44:17 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
Timm1. thread-safety 2. memory usage control 3. транзакционность данных Штатными средствами что вообще за вопрос? Timmпри работе с этим кэшем? сколько их (кэшей) нужно? когда в него попадают данные? когда "пропадают"? про синхронизацию и кластер пока молчу. Кэш никогда не будет хранить версию большую чем та что в базе. Соответственно, можно при любых попытках сохранить версию более раннюю чем закешированую, можно выдавать отлуп. Этот кэш даже распределять не обязательно. TimmPS. примерчег кода будет очень кстати. Ага, а ORM тут за 5 минут не набросать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 13:13:38 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЯ нигде не говорил про полный вынос локов в приложение. Я говорил что, вынося локи из базы, можно получать прирост производительности. позволю себе небольшой пук .... нужно просто разделять транзакции и локи уровня базы и уровня приложения. это совершенно разные понятия. разумеется можно реализовывать длинную транзакцию уровня приложения с помощью пессимистической блокировки FOR UPDATE.. но какой это сакс не мне вам рассказывать. гораздо эффективнее использовать оптимистическую "блокировку" с помощью колонок версий UPDATE ... WHERE verson=223 . но нужно понимать что работает это только потому что база обеспечивает READCOMMITED посредством своих лочек. т.е. когда мы флашим хибер сессию в кучу таких оптимистичных апдейтов. проапдейченные строчки блокируются - селекты других транзакций на них просто повисают. если один из апдейтов не проходит - версия поменялась т.е. имеем ноль проапдейченных строчек, получаем эксепшн и откатываем всё к чертям. тем самым имеем атомарный и целостный накат длинющей транзакции приложения очень дёшево и эффективно. это мне кажется более точная формулировка "выноса локов..." ну а организация таблички блокировок ("пессимизм своими руками") приводит к ботлнеку и куче висящих селектов. но имхо лучше for updateа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 13:13:52 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
exppпроапдейченные строчки блокируются - селекты других транзакций на них просто повисают.Это где так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 13:32:11 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Timm1. thread-safety 2. memory usage control 3. транзакционность данных Штатными средствами что вообще за вопрос? Хочу их увидеть in action, в данном конкретном случае, come on! BlazkowiczАга, а ORM тут за 5 минут не набросать? Т.е. ты такую весчь не применял, но советуешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 13:33:53 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
pamir exppпроапдейченные строчки блокируются - селекты других транзакций на них просто повисают.Это где так? а где не так? я может не очень подробно изложил свою мысль... берёшь свою дб консоль, открываешь два конекшна, вырубаешь автокомит, ставишь readcommited, в одной транзакции апдейт, и селекти эти строки в другой, результат селекта зависит от комита/ролбака первой транзакции удивительное рядом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 13:44:35 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
expp pamir exppпроапдейченные строчки блокируются - селекты других транзакций на них просто повисают.Это где так? а где не так? я может не очень подробно изложил свою мысль... берёшь свою дб консоль, открываешь два конекшна, вырубаешь автокомит, ставишь readcommited, в одной транзакции апдейт, и селекти эти строки в другой, результат селекта зависит от комита/ролбака первой транзакции удивительное рядомВ оракле. Как и в любом версионнике. Там ничто не блокирует читающие транзакции. Если ты еще не закоммитил, то читающая прочтет те данные, которые лежат. Твоих еще не существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 13:50:40 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
с "версионниками" не сталкивался. это похоже на ресурсожоркий SERIALIZABLE. какой уровень изоляции указан в свойствах соединения? ну и проверялось это на MSSQL DB2 Derby ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 13:59:25 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
TimmТ.е. ты такую весчь не применял, но советуешь? Да, я уже давно нормальных проектов не кодирую. Но это мне никак не мешает разбиратся в теории. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 14:00:10 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
exppс "версионниками" не сталкивался. это похоже на ресурсожоркий SERIALIZABLE. Именно, но только похоже. Добивается поведение уроня SERIALIZABLE, но _гораздо_ менее ресурсоемким способом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 14:02:44 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
ну так в графе изоляция что написано? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 14:19:02 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
оракле, насколько помню, их только два READ COMMITED и SERIALIZABLE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 14:21:38 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
exppс "версионниками" не сталкивался. это похоже на ресурсожоркий SERIALIZABLE. какой уровень изоляции указан в свойствах соединения? ну и проверялось это на MSSQL DB2 Derby Таблица teams пустая Первый коннект INSERT INTO teams (code, team_name, assoc_id) VALUES ('ttt', 'namet', 1); Сommt; Второй коннект SET TRANSACTION ISOLATION LEVEL READ COMMITTED SELECT * FROM teams Вижу. Первый коннект SET TRANSACTION ISOLATION LEVEL READ COMMITTED SELECT * FROM teams Вижу UPDATE teams SET team_name = 'sdfsdf' WHERE code='ttt'; Второй коннект --SET TRANSACTION ISOLATION LEVEL READ COMMITTED (это уже выставлено, второй раз не дает) SELECT * FROM teams Вижу старые данные Первый коннект commit; Второй коннект видит новые данные. Просто не нужно считать, что "у всех так", если работали только с блокировочниками. У версионников все иначе. Войну oracle vs ms sql начинать не собираюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 14:23:32 |
|
||
|
WEB интерфейс
|
|||
|---|---|---|---|
|
#18+
fixxerоракле, насколько помню, их только два READ COMMITED и SERIALIZABLE.Ага ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2007, 14:24:07 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=34849728&tid=2144411]: |
0ms |
get settings: |
14ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
| others: | 322ms |
| total: | 486ms |

| 0 / 0 |
