|
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 13
|
||||||
"Идеология правильности"13.02.2010, 18:22. Показов 5492. Ответов 40
Метки нет (Все метки)
Насколько правилен идеологически такой код (он рабочий):
0
|
||||||
| 13.02.2010, 18:22 | |
|
Ответы с готовыми решениями:
40
Проверка правильности ввода в консоли Проверка правильности MAC адреса |
|
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
|
|
| 14.02.2010, 21:33 | |
|
С моей точки зрения код корректен. Вполне разумно использовать бин внутри скриплетов и парарельно брать его свойства через акссессор. В итоге всё полюбому в сервлет скопируется. Что бы я сказал мне не нравится
1. Слишком много бизнес логики для JSP. Все циклы должны быть в кастом тагах. Хотя это конечно если время есть. Вебдизайнеру уже этот код не понять 2. Если бин создаётся конструктором без параметров то инициализацию можно пропустить, так как одно из требований к бину что он может быть создан конструктором по умолчанию. Если бин не создан в момент когда страница вызывается он создаётся автоматически. Если вы затем поместите бин в сессию (не ваш случай я понимаю) то он будет там жить и следующее обращение к этой странице не вызовет повторное создание бина.
0
|
|
|
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
|
|
| 15.02.2010, 21:21 | |
|
И кстати мне кажется что этот код не thread safe. Так как i общая для всех тредов а в скриплете который выполняется в service нет синхронизируюшего блока. Хотя это ерунда конечно.
0
|
|
|
0 / 0 / 0
Регистрация: 10.02.2010
Сообщений: 80
|
|
| 16.02.2010, 16:02 | |
|
Если можно про это поподробнее:
что такое thread safe, для чего это надо? И насколько это важно?
0
|
|
|
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
|
|||||||||||
| 16.02.2010, 22:11 | |||||||||||
|
Каждый сервлет имеет только один экземпляр. То есть глобально задекларированые переменные существуют в единственном экземпляре... метод service в свою очередь выполняется для каждого запроса (doGet,doPost,doDelete etc) в отдельном потоке(треде). Если тред использует глобальные переменные он должен использовать их в синхронизированом блоке. Или как вариант указать что сервлет не есть thread safe. И сервер должен подовать ему все запросы последовательно(что резко замедляет работу); JSP в свою очередь компилируются в сервлет следующим образом
<%! означает декларирование глобальной переменной <% означает код внутри service метода Non-thread safe code
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
|
|
| 17.02.2010, 00:31 | |
|
2simplepilot
А вы уверены, что контейнер создает только один экземпляр сервлета? Я где-то читал, что это зависит от контейнера. Если нагрузка большая, то запросы или копятся в очереди, или создаются новые экземпляры сервлетов. Я, используя Томкат, не наблюдал создания новых экземпляров. У меня было ощущение, что Томкат лучше помрет, чем создаст новый экземпляр сервлета. Но может это определяется настройками?
0
|
|
|
0 / 0 / 2
Регистрация: 29.09.2009
Сообщений: 48
|
|
| 17.02.2010, 16:24 | |
|
Tread safe code - это когда гарантируется, что ВЕСЬ этот код за раз будет выполнет только в одном потоке.
По умолчанию сервлет не thread safe, это означает что метод service() ОДНОГО экземпляра сервлета выполняется паралельно в разных потоках. Количество потоков соответствует количеству обрабатываемых в данный момент реквестов. Если сервлет обладает состоянием, то все зависит от того что мы хотим делать с ним. Если состояние общее для приложения, то синхронизуем операции над ним. Если же состояние уникально для каждого реквеста, то тогда нужно чтобы сервлет имплементировал javax.servlet.SingleThreadModel. Это маркер-интерфейс который указывает севлет контейнеру, что для каждого реквеста должен быть предоставлен новый экземпляр сервлета. Т.е чтобы метод service() был выполнен в одном потоке. Вопрос о том как он может быть предоставлен зависит от реализации сервет контейнера. Наиболее разумен подход с реализаций пула объектов для каждого из таких сервлетов.
0
|
|
|
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
|
|
| 17.02.2010, 17:28 | |
|
Спасибо за разьяснение, я как-то совсем забыл, что SingleThreadModel как раз и служит для того, чтобы контейнер стал создавать новые обьекты сервлетов при необходимости.
0
|
|
|
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
|
|
| 17.02.2010, 21:01 | |
|
Контейнер никогда(!) не будет создовать несколько экземпляров сервлета. Если у вас сервлет не thread safe то все запросы будут стоять в очереди к единственному экземпляру сервлета, в противном случае (сервлет считается thread safe по умолчанию) все запросы будут идти к одному экземпляру в котором метод service будет выполняться в своём потоке. Если вы встретите другое поведение то это уже (имхо) будет не J2EE совместимый контейнер - спецификация требует что бы сервлет существовал всегда в одном экземпляре
0
|
|
|
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
|
|
| 17.02.2010, 21:47 | |
|
Tread safe code - это когда гарантируется, что ВЕСЬ этот код за раз будет выполнет только в одном потоке.
>>Что то не понял вашей мысли ? что значит весь код ? метода service ? так он всегда будет выполнен в одном потоке (если сам других потоков не создаст) другой вопрос сколько методов service будет выполнятся одновременно - по умолчанию сколько угодно контейрнеру; То есть по умолчанию сервлет считается thread safe переключение на SingleThreadModel крайне не рекомендуется так как снижает быстродействие. В версии Servlets 2.4 это модель объявлена depricated. По умолчанию сервлет не thread safe, >>Откуда эта информация ? Мне кажется наоборот. это означает что метод service() ОДНОГО экземпляра сервлета выполняется паралельно в разных потоках. >>Это то да но только потому что сервлет есть thread safe по крайней мере считается таковым. Если вы его таким не сделаете то это будут ваши проблемы
0
|
|
|
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
|
|
| 17.02.2010, 23:02 | |
|
Это, на мой взгляд, просто небольшая путаница в применении термина thread safe.
А почему SingleThreadModel замедляет? Например, пришло два запроса - берем два сервлета из пула и обрабатываем запросы в двух потоках. Иначе, если используем один сервлет, его метод service должен быть синхронизирован. Значит эти два запроса будут обрабатываться последовательно в одном потоке. Если обработка запроса включает в себя медленные операции ввода-вывода, то многопоточная обработка должна быть предпочтительнее?
0
|
|
|
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
|
|
| 17.02.2010, 23:45 | |
|
Это, на мой взгляд, просто небольшая путаница в применении термина thread safe.
Дело в том что в JSP есть специальный атрибут isThreadSafe. Вот что пишут об этом в книге <%page isThreadSafe='true' %> <%!-- Default --> A value of true means that you have to (то есть должны) made your code thread safe and then the system can send multiply concurent requests. А почему SingleThreadModel замедляет? Например, пришло два запроса - берем два сервлета из пула и обрабатываем запросы в двух потоках. Не может она взять два сервлета, система возьмёт один сервлет и выполнит сначала первый запрос а потом второй. При SingleThreadModel обработка двух запросов паралельно исключена в любом виде. Иначе, если используем один сервлет, его метод service должен быть синхронизирован. Один сервлет используется всегда ! Значит эти два запроса будут обрабатываться последовательно в одном потоке. Да нет потоки будут может и разные но второй начнёт работать после завершения работы первого и относится это к ситуации isThreadSafe=false Если обработка запроса включает в себя медленные операции ввода-вывода, то многопоточная обработка должна быть предпочтительнее? Многопоточная обработка по любому предпочтительней. Но если например у вас есть один доступ к ресурсу в один момент времени то лучше делать isThreadSafe=false. Возможная ситуация у вас есть асинхронный канал передачи сообщений например IBM MQSeries. Первый сервлет выполнил посылку сообщения и ждёт ответа в этот момент второй сервлет начинает работу и тоже посылает сообщение. Приходит ответ на первое сообщение но его первым успевает прочитать второй сервлет - что есть очень плохо. Следовательно в этом случае нам надо объявить isThreadSafe=false (для JSP) или SingleThreadModel для сервлета и запретить обработку двух запросов одновременно.
0
|
|
|
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
|
|
| 17.02.2010, 23:56 | |
|
Я использую голые сервлеты,Томкат и больше ничего. Думаю, что если обьявить сервлет SingleThreadModel, то Томкат обязан будет создавать новые инстансы. Проверю. Потому что у меня как раз эта ситуация: чтобы ответить клиенту сервлет посылает запрос куда-то еще и может долго ждать ответа.
0
|
|
|
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
|
|
| 18.02.2010, 19:27 | |
|
Проверил. Если сервлет имплементирует SingleThreadModel, то при увеличении потока запросов Томкат создает новые обьекты сервлета.
0
|
|
|
0 / 0 / 2
Регистрация: 29.09.2009
Сообщений: 48
|
|
| 23.02.2010, 10:16 | |
|
>2 simplepilot
Не может она взять два сервлета, система возьмёт один сервлет и выполнит сначала первый запрос а потом второй. При SingleThreadModel обработка двух запросов паралельно исключена в любом виде. Читаем спецификацию public interface SingleThreadModel Ensures that servlets handle only one request at a time. This interface has no methods. If a servlet implements this interface, you are guaranteed that no two threads will execute concurrently in the servlet’s service method. The servlet container can make this guarantee by synchronizing access to a single instance of the servlet, or by maintaining a pool of servlet instances and dispatching each new request to a free servlet. То бишь стратегия предоставления инстанса сервлета зависить от реализации сервлет контейнера. ЗЫ. и чего обсуждаем ? -- не пойму ....
0
|
|
|
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
|
|
| 23.02.2010, 19:37 | |
|
Вы сначала пишете, что .. 'При SingleThreadModel обработка двух запросов паралельно исключена в любом виде.' , а потом приводите спецификацию, в которой сказано, что контейнер может организовать пул сервлетов и брать для каждого запроса инстансы оттуда. Так это и есть параллельная обработка. Пришло 2 запроса одновременно, контейнер извлек 2 инстанса сервлета из пула (или создал их) и сунул в них эти запросы.
Понятно, что 'параллельная обработка' имеется в виду обработка в разных потоках, так как процессор обычно все равно один. Пусть на сервлет приходит запрос. Пока сервлет не ответил на этот запрос, он должен быть недоступен для других запросов. Если мы это реализуем через обьявление его методов synchronized , то контейнер будет использовать одну инстанс сервлета и все запросы будут обрабатываться последовательно. Если же мы это реализуем путем навешивания на сервлет SingleThreadModel интерфейса, то контейнер имеет право(а по моей логике - обязан, иначе нафига этот интерфейс вообще нужен) создать для каждого запроса свой инстанс сервлета. Томкат именно так и поступает и это очень хорошо.
0
|
|
|
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
|
|
| 23.02.2010, 19:49 | |
|
2vl romanov
Виноват, не понял, что вы цитируете simplepilot.
0
|
|
|
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
|
|
| 23.02.2010, 20:47 | |
|
Хмм. Не знал. Думал что если поставить в сервлете какую то общую переменную и инициализировать её в init() методе , а потом закрывать в destroy() то каждый из методов будет выполнен только однажды независимо от модели. Хотя склонен верить спецификации. Получается что физически могут существовать несколько сервлетов в пуле с разными значениями общих переменных. Это как то мне совсем не нравится :-(
0
|
|
|
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
|
|
| 23.02.2010, 21:27 | |
|
Если 'общая переменная' - статическая переменная, то она будет одна для всех инстансев сервлета. А их может быть много, если сервлет имплементирует SingleThreadModel.
0
|
|
|
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
|
|
| 23.02.2010, 21:29 | |
|
И это не противоречит спецификации.
0
|
|
| 23.02.2010, 21:29 | |
|
Помогаю со студенческими работами здесь
20
Проверка правильности введеного пароля Проверка правильности postfix expression Задача на определение правильности даты Оценка правильности написания кода Идеология схемы БД Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во
всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
|