Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Целостность информации, synchronized или singleton 
V
    Опции темы
Zamuta
Дата 18.6.2007, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



Здрасьте. У меня опять вопрос по архитектуре, т.к. в книжках конечно всё красиво пишут, но про реальную работу приложений лучше поинтересоваться у Вас.

Суть такая. Некий класс записывает в бд информацию в результате проделанных юзером манипуляций. Причём и имена таблиц и сама информация разные в зависимости от действий юзера. Сначала данные кладутся в сессион мап, а затем по этим данным делаются записи в бд. В конечном итоге на одного юзера приходится около 6-8 инсертов, селектов за раз, т.е. единовременно. Коннект с бд через пул. 

В конце, когда юзер сделал все свои манипуляции и хочет сделать сохранение он таким образом запускает цепочку методов, которые тянут инфу из сессии и в результате происходит запись.  А что если в один момент времени данные попытаются сохранить 10 юзеров. Мы ведь не исключаем такой ситуации. Целостность информации в бд можно обеспечить транзакциями, но т.к. все они будут тянуть одну  и ту же цепочку методов, то не возникнет ли здесь неожиданных моментов? В зависимости от загрузки бд одни данные уйдут сразу, другие будут ждать окончания транзакции, а тут ещё кто-то пытается сделать сохранение. Я к тому что вызов той самой цепочки методов для каждого юзера происходит последовательно или они все будут сваливаться в кучу? Я хочу обеспечить именно последовательность выполнения операций. Что здесь больше подойдёт singleton или делать методы synchronized ?


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
nornad
Дата 18.6.2007, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: нет
Всего: 31



А не проще организовать очередь выполнения? "Юзер" добавляет свою операцию в очередь (точнее, транзакцию). Очередь принимает новую операцию и если больше операций нет, то добавляемая сразу отправляется на выполнение. После выполнения операции, она удаляется из очереди, производится проверка на пустоту очереди и если в очереди что-то есть, выполняется следующая операция.

Цитата(Zamuta @  18.6.2007,  07:05 Найти цитируемый пост)
Что здесь больше подойдёт singleton или делать методы synchronized ?

Если всё череде одну "дырку", то потребуется и synchronized (клиентов же много), и singleton (чтобы дырка точно одна была).
А если тебя не страшит возможность создания нескольких "дырок", то и не заморачивайся - драйвер СУБД обычно сам неплохо работает с различными потоками/приложениями.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Zamuta
Дата 18.6.2007, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



nornad, 
Цитата
А не проще организовать очередь выполнения?


Ты имеешь в виду java.util.Stack ? А конкретно для веба своего решения ситуации нет? Скорее всего я не первый с этим сталкиваюсь....


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
MisterCleric
Дата 18.6.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



привет. nornad правильно, говорит: надо организовать очередь. Посмотри в сторону шаблона Command. И тебе нужно еще учесть момент, что юзер делал-делал что-то, а тут ему захотелось все отменить ..., или не все ....


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
nornad
Дата 18.6.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: нет
Всего: 31



Цитата(Zamuta @  18.6.2007,  09:58 Найти цитируемый пост)
Ты имеешь в виду java.util.Stack ?

Если говорить про конкретный контейнер, то использовать нужно не стек (Stack), а очередь (Queue).
Насчёт готовых решений для вэба (о котором, кстати, изначально ничего не говорилось) я не в курсе - с вэбом почти не работаю.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Stampede
Дата 18.6.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Zamuta, недостаточно инфы.

По тому скудному описанию, что ты привел, я бы посоветовал изолировать транзакции на границе бизнес-метода. Например, объявить его как synchronized (предполагая, что это класс-синглтон), или через какой-то статический объект, используемый в качестве замка, или через один из примитивов синхронизации.

В этом случае ты без лишнего гемора добъешься того, что все запросы на выполнение данного метода будут автоматически выстраиваться в очередь. Плюс - стопудовая гарантия целостности транзакций. Минус - возможные проблемы с масштабируемостью, а также недоиспользование аппаратных мощностей.

Чтобы предложить что-то более конкретное, нужна более подробная инфа. В частности, интересует следующее:
  • сколько времени (хотя бы примерно, в среднем) занимает выполнение транзакции?
  • какая ожидается пиковая нагрузка?
  • есть ли в приложении другие бизнес-методы, которые могут конкурировать по записи?

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


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Zamuta
Дата 19.6.2007, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



Stampede,
Цитата
В этом случае ты без лишнего гемора добъешься того, что все запросы на выполнение данного метода будут автоматически выстраиваться в очередь. Плюс - стопудовая гарантия целостности транзакций.
 
Вот именно это мне и нужно, но вопрос в том правильно ли всё будет работать без этих мер? С одним юзером всё понятно, но какой же интернет ресурс имеет только одного пользователя ? smile  В случае попытки выполнения метода, который вызывает другие методы, которые достают инфу из сессии, и ещё много чего 10 юзерами выполнение будет происходить поочерёдно или как? Нет ли здесь неожиданных ситуаций? Заботиться ли об этом контейнер (tomcat)? Просто у меня пока не достаточно опыта для того чтобы отследить этот момент тем более для нескольких юзеров одновременно. Раз ты предложил решение этого вопроса значит неприятные ситуации возникнуть всё таки могут. 
Цитата
сколько времени (хотя бы примерно, в среднем) занимает выполнение транзакции?

Транзакции конечно же необходимы, за одну транзакцию происходит выбор и запись по 5-8 таблицам, но это уже проблемы бд (mysql).
О том сколько времени занимает транзакция можно судить лишь о том что используются prepared statement и запросы по своей структуре не сложные, селекты и инсерты осложнены только where username_id = '', т.е. везде отталкиваюсь от порядкового номера юзера в бд.  
Цитата
какая ожидается пиковая нагрузка?

Предполагается создание достаточно посещаемого ресурса, думаю пиковая нагрузка на первое время около 20-30 вызовов/сек того самого метода о котором мы говорим, обращений к бд само собой больше, но уже только селекты
Цитата
есть ли в приложении другие бизнес-методы, которые могут конкурировать по записи?

Нет, только один метод. Но в моём понимании это будет в случае с synchronized синглтон, потому и такой вопрос. 
В книге С.Стелтинг  О.Маасен Применение шаблонов java про синглтон пишут:
Цитата
С другой стороны, в зависимости от реализации шаблон Singleton может представлять собой проблему для многопоточных приложений. В таких приложениях необходимо с повышенным вниманием следить за процессом инициализации объекта-одиночки, так как в некоторых ситуациях приложение может войти в состояние "войны потоков".

Это поэтому ты сказал, что
Цитата
Например, объявить его как synchronized
?


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
ekr
Дата 19.6.2007, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

Репутация: 12
Всего: 19



Hi all.
Коллеги, скажите, а к чему такие сложности? Может, я неправильно понял задачу... 
Но все же, зачем с помощью сериализации, выстраивания вызовов в очередь организовывать лишний bottleneck (здесь я согласен с Stampede)? 

На мой взгляд можно так сделать: пользователь проводит свои активности, накапливая изменения. Затем в финальном методе (когда юзер даст сигнал) просто получать соединение из пула, и в рамках транзакции модифицировать базу. 
Цитата(Zamuta @  18.6.2007,  04:05 Найти цитируемый пост)
но т.к. все они будут тянуть одну  и ту же цепочку методов, то не возникнет ли здесь неожиданных моментов?

Логика сохранения будет выполняться в многопоточном режиме, эт точно. Но соединение с БД будет персональным для треда, и транзакция тоже. Так что БД должна будет изолировать транзакции друг от друга.
Вот для этого надо будет почитать про уровни изоляции транзакций ))), узнать, поддерживается ли нужный в данной СУБД и установить его.

Вот если СУБД не сможет внятно изолировать транзакции, тогда  уже надо будет сериализовать (выстраивать в последовательность) операции средствами бизнес-логики, т.е. см. советы nornad, MisterCleric.


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
Stampede
Дата 20.6.2007, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Цитата(ekr @  19.6.2007,  13:20 Найти цитируемый пост)
Так что БД должна будет изолировать транзакции друг от друга.


Есть один нюанс. Поскольку транзакция включает выборки, можно предположить, что результаты этих выборок так или иначе будут использованы в операциях вставки. Если при этом не выставить уровень изоляции в SERIALIZED, есть немалый шанс нахватать фантомных ридов (хотя, конечно, сильно зависит от характера запросов). А сериализовать всю транзакцию - это в данном контексте то же самое, что синхронизовать бизнес-метод. Как лучше - это уже больше вопрос того, как мы собираемся управлять конкурентным доступом: программно или средствами базы. Есть мнение, что программно будет погибче, но при этом сложнее (и соответственно с большей вероятностью ошибок в логике) в реализации.

А вообще при такой ожидаемой загрузке (20-30 транзакций в секунду), возможно, придется смотреть в сторону более "взрослых" решений типа EJB.

Добавлено через 6 минут
Цитата(Zamuta @  18.6.2007,  16:31 Найти цитируемый пост)
Это поэтому ты сказал, что
Цитата
Например, объявить его как synchronized
? 


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



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Zamuta
Дата 20.6.2007, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



Stampede, после твоих ответов у меня не остаётся вопросов, всё доходчиво. Это плюс.


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
ekr
Дата 20.6.2007, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

Репутация: 12
Всего: 19



Цитата(Stampede @  20.6.2007,  00:31 Найти цитируемый пост)
Если при этом не выставить уровень изоляции в SERIALIZED, есть немалый шанс нахватать фантомных ридов (хотя, конечно, сильно зависит от характера запросов).

Действительно, надо посмотреть на специфику запросов. Но так же надо учитывать, какие уровни изоляции реально поддерживает выбранная СУБД. Не все могут обеспечить SERIALIZABLE.

Цитата(Stampede @  20.6.2007,  00:31 Найти цитируемый пост)
А сериализовать всю транзакцию

А как еще её можно сериализовать? СУБД изолирует транзакции друг от друга целиком. С переменным успехом )))) В зависимости от выбранного уровня изоляции. Можно, конечно натыкать savepoints, но это уже тема отдельной долгой беседы )))

Цитата(Stampede @  20.6.2007,  00:31 Найти цитируемый пост)
Как лучше - это уже больше вопрос того, как мы собираемся управлять конкурентным доступом: программно или средствами базы

На мой взгляд - лучше выбрать нормальную СУБД и ей доверить Родину )))

Цитата(Stampede @  20.6.2007,  00:31 Найти цитируемый пост)
Есть мнение, что программно будет погибче, но при этом сложнее (и соответственно с большей вероятностью ошибок в логике) в реализации.

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

Цитата(Stampede @  20.6.2007,  00:31 Найти цитируемый пост)
придется смотреть в сторону более "взрослых" решений типа EJB.

Вот здесь надо осторожно. Стоимость входа в эту технологию довольно высока (собственно разработка, обучение). Да, есть чудные бонусы, но надо сесть и внимательно посчитать, стоИт ли оно того.
Бонусы, которые в данном случае могут помочь (но не решить проблему целиком): распределенные транзакции и Entity EJB.


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.4979 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.