powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по SingleThreadModel
21 сообщений из 46, страница 2 из 2
Вопрос по SingleThreadModel
    #34840659
324f4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
324f4Или есть какие-то другие варианты решения проблемы?
Да, причем всегда. Думать надо головой а не другими частями тела.[/quot]
Какие мы самонадеянные! Говорить-то всегда легко!
Короче получается так, что не успевает коллекция из одного потока закрыться, как в нее лезет другой поток и вытаскивает оттуда данные, которые этого другого потока ну никак не касаются.
Синхронизировать коллекцию не рекомендуют, так как будут в сервлете "узкие места". Может еще как-то можно обойти проблему?
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34840745
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
324f4Какие мы самонадеянные! Говорить-то всегда легко!
Короче получается так, что не успевает коллекция из одного потока закрыться, как в нее лезет другой поток и вытаскивает оттуда данные, которые этого другого потока ну никак не касаются.
Синхронизировать коллекцию не рекомендуют, так как будут в сервлете "узкие места". Может еще как-то можно обойти проблему?
Зачем коллекция находится в поле? Только чтобы шарить её между методами? Если локальная переменная не подходит, используй ThreadLocal. Ты же код не показываешь и ничего нормально не объясняешь. Какой же помощи можно таким образом получить? Начать хотя бы с того что с обычными коллекциями никак не связан глагол "закрыть"
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34840972
MBasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разные потоки это разные запросы клиентов.
Как справедоиво было замечено общая коллекция нужна только в том случае,
когда ее данные разделяются (просматриваются и ИЗМЕНЯЮТСЯ) множеством
пользователей одновременно.

Сегодня предельно ясно, что нельзя использовать перемнные экземпляра
сервлета (поля) для сохраннения изменяемой информации. Для этого
следует использовать атрибуты запроса или контекст сеанса.

Смело создаем для каждого сеанса отдельную коллекцию и, если в конечном
требуется итоге слить ее в одну коллекцию, сохраняемую в контексте
сервлета (приложения), то делаем это в некоторые дискретные промежутки
времени одним потоком.
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34842033
Фотография Java Programmer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
324f4 324f4Или есть какие-то другие варианты решения проблемы?
Да, причем всегда. Думать надо головой а не другими частями тела.
Какие мы самонадеянные! Говорить-то всегда легко!
Короче получается так, что не успевает коллекция из одного потока закрыться, как в нее лезет другой поток и вытаскивает оттуда данные, которые этого другого потока ну никак не касаются.
Синхронизировать коллекцию не рекомендуют, так как будут в сервлете "узкие места". Может еще как-то можно обойти проблему?[/quot]

заводить какие либо поля в сервлете - это по моему антипаттерн - этого делать не стоит, я бы на вашем месте задумался нужна ли ваабще здесь эта коллекция - которая одна и та же для разных пользователей - если нужна сделайте сервисный метод (не в сервлете) на уровне сервисов или если нету такого уровня то на уровне дао, в котором происходит изменение этой коллекции там синхронизуйте что хотите - а тут никаких полей заводить не надо
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34842556
324f4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привожу на вашу критику фрагмент кода, чтобы было понятно:

Код: 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.
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.
 public    void   doPost(HttpServletRequest req, HttpServletResponse resp)
			 throws  ServletException, IOException 
{
  req.setCharacterEncoding("UTF-8");
  System.out.println(req.getCharacterEncoding());

// здесь объявляю локальные переменные
            String xmlString =  null ;
	String my =  null ;
	String sel =  null ;
	String sql =  null ;
	String[] rom =  null ;
	IDfCollection col= null ; // эта коллекция
	IDfSession session =  null ;
	IDfQuery q= null ;
	Vector	zabiv= null ;
// здесь объявляю локальные переменные

NtmkNtdAdvSearchEx df=  new  NtmkNtdAdvSearchEx(); // это необходимо для сессии

//присваивание
zabiv =  new  Vector();
my = req.getParameter("mykey");
sel = req.getParameter("vibor");
//присваивание

 if  (!my.equals("")) 
{
	 try 
     {
session =df.getMySession(); // получаем сессию
System.out.println("Session ID="+session.getSessionId()); 
 if  ((sel.equals("authors")) || (sel.equals("keywords"))) {
//здесь формируем строку для некоего запроса:
sql = "select distinct " + sel
+ " from ntmk_ntd where any Upper(" + sel
+ ") like Upper('%" + my
+ "%') order by 1 asc ENABLE(ROW_BASED)";
 }
IDfClientX clientx =  new  DfClientX(); //необходимо для выполнения запроса
q = clientx.getQuery();  // необходимо для выполнения запроса
q.setDQL(sql);   // выполняем запрос

// Вот здесь забиваем результат запроса в коллекцию:
col = q.execute(session, IDfQuery.DF_READ_QUERY); 
// извлекаем из коллекции данные в вектор в цикле while:
 while  (col.next()) {
zabiv.addElement(col.getString(col.getAttr( 0 ).getName()));
System.out.println(col.getString(col.getAttr( 0 ).getName())); 
}
rom =  new  String[zabiv.size()];
 for  ( int  i =  0 ; i < zabiv.size(); i++) {
rom[i] = (String) zabiv.elementAt(i);
}
zabiv.removeAllElements();
xmlString =  this .getXMLData(rom);
 this .writeResponse(resp, xmlString);
}

 catch  (DfException e) 
	{
DfLogger.error( this , e.getMessage(),  null , e);
e.printStackTrace();
 throw   new  DfCriticalException(e);
				
} 
  finally  //блок finally
  {
 if  (col !=  null ) 
{
 try  
{
col.close(); // здесь закрываем коллекцию
System.out.println("CLOSE");
}//try 
 catch  (DfException e) {
DfLogger.error( this , e.getMessage(),  null , e);
e.printStackTrace();
 throw   new  DfCriticalException(e);
 }//catch
} //if
}
..........

Объявил все переменные локально, как необходимо. Но не уверен, что будет работать корректно.
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34842561
324f4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBasilРазные потоки это разные запросы клиентов.
Как справедоиво было замечено общая коллекция нужна только в том случае,
когда ее данные разделяются (просматриваются и ИЗМЕНЯЮТСЯ) множеством
пользователей одновременно.

Сегодня предельно ясно, что нельзя использовать перемнные экземпляра
сервлета (поля) для сохраннения изменяемой информации. Для этого
следует использовать атрибуты запроса или контекст сеанса.

Смело создаем для каждого сеанса отдельную коллекцию и, если в конечном
требуется итоге слить ее в одну коллекцию, сохраняемую в контексте
сервлета (приложения), то делаем это в некоторые дискретные промежутки
времени одним потоком.
Мне как раз не нужно, чтобы коллекция использовалась одновременно всеми пользователями, она не должна быть общей. Мне нужно, чтобы в каждом потоке для каждого пользователя была своя индивидуальная коллекция! Привел фрагмент кода-см.выше. Все переменные объявил локально, а не как поля сервлета. Так что смотрите, критикуйте))
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34842907
Фотография Java Programmer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
324f4 MBasilРазные потоки это разные запросы клиентов.
Как справедоиво было замечено общая коллекция нужна только в том случае,
когда ее данные разделяются (просматриваются и ИЗМЕНЯЮТСЯ) множеством
пользователей одновременно.

Сегодня предельно ясно, что нельзя использовать перемнные экземпляра
сервлета (поля) для сохраннения изменяемой информации. Для этого
следует использовать атрибуты запроса или контекст сеанса.

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


Итак - первое - хочу отметить, что первую свою проблему - вы решили ) все будет работать ) НО!

Есть несколько существенных замечаний )
1) Там где вы формируете sql запрос - есть большая security problem - этот метод формирования запроса позволяет провести sql injection, для решения этой проблемы - я советую более внимательно относится к валидации реквестовых параметров, а еще лучше - использовать Hibernate

2) Не стоит заниматься в сервлете тем что вормировать запросы к бд - это надо делать немного на другом уровне - выделите дао - и там производите доступ - иначе код превращается в лапшу

3) Кроме того код не очень читается - постарайтесь писать переменные - по мере необходимости тоесть сужайте область видимости переменных
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34842913
kest_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
324f4Мне как раз не нужно, чтобы коллекция использовалась одновременно всеми пользователями, она не должна быть общей. Мне нужно, чтобы в каждом потоке для каждого пользователя была своя индивидуальная коллекция! Привел фрагмент кода-см.выше. Все переменные объявил локально, а не как поля сервлета. Так что смотрите, критикуйте))
Ну а смысл был вообще выносить эту чисто локальную коллекцию из метода и морочить нам мозги? :)

Ну в вообще твой код это... что-то... Можно книгу написать не тему "так делать нельзя". Почитай что-ли книжку какую-нибудь, типа Горький вкус Java, Рефакторинг Фаулера...
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34842936
Фотография Java Programmer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Java Programmer 324f4 MBasilРазные потоки это разные запросы клиентов.
Как справедоиво было замечено общая коллекция нужна только в том случае,
когда ее данные разделяются (просматриваются и ИЗМЕНЯЮТСЯ) множеством
пользователей одновременно.

Сегодня предельно ясно, что нельзя использовать перемнные экземпляра
сервлета (поля) для сохраннения изменяемой информации. Для этого
следует использовать атрибуты запроса или контекст сеанса.

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


Итак - первое - хочу отметить, что первую свою проблему - вы решили ) все будет работать ) НО!

Есть несколько существенных замечаний )
1) Там где вы формируете sql запрос - есть большая security problem - этот метод формирования запроса позволяет провести sql injection, для решения этой проблемы - я советую более внимательно относится к валидации реквестовых параметров, а еще лучше - использовать Hibernate

2) Не стоит заниматься в сервлете тем что вормировать запросы к бд - это надо делать немного на другом уровне - выделите дао - и там производите доступ - иначе код превращается в лапшу

3) Кроме того код не очень читается - постарайтесь писать переменные - по мере необходимости тоесть сужайте область видимости переменных


Ах да забыл - зачем вам нужен вектор ??
я конечно понимаю что разработчики java сказали что поправили все баги с этим динозавриком )
Но я все же не стал бы использовать здесь вектор, хотя бы потому что он медленнее ArrayList за счет того что он синхронизованный - я думаю не стоит использовать Вектор в ThreadSafe коде
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34843065
MBasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это

for (int i = 0; i < zabiv.size(); i++) {
rom = (String) zabiv.elementAt(i);
}

плохо, поскольку медленно, если у Вас версия до 1.5, то так;

Iterator iter = zabiv.get(property);
while (iter.hasNext()) {
rom = (String) iter.next();
}

а начиная с 1.5 лучше так:

List<String> zabiv = new LinkedList<String>;
. . .
for( String s : zabiv ) {
rom = s;
}

Действие zabiv.removeAllElements();
вовсе не требуется, поскольку ссылка zabiv на коллекцию выбрасывается в мусор.

Однако зачем из коллекции перебрасывать в массив,
не лучше ли использовать для обработки непосредственно коллекцию.

И вообще, как мягко заметил "Java Programmer" сегодня вообще
такое решение недопустимо. Сервлет не должен выполнять
запросов в базу. Даже, если Вы не желаете использовать какие-либо
оболочки (типа Hibernate, а используете POJO) надо задействовать
шаблон DAO и создать дополнительную прослойку в виде службы.

Кроме того, там где это возможно, лучше использовать для запросов PreparedStatement
при вводе параметров запроса.
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34843091
MBasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, опечаточка вышла, конечно :
Код: plaintext
1.
2.
3.
4.
 int  j= 0 ;
 for ( String s : zabiv ) { 
      rom[j++] = s;
 }

А кроме того редактор формуа почему-то выбросил мои
квадратные скобки с буквой i внутри.
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34845415
324f4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри за кривые переменные) Просто еще с паскаля привычка осталась объявлять переменные перед непосредственно кодом.
Что касается формирования в сервлете запросов к бд - в моем случае это не есть непосредственно запрос к БД (я же в начале говорил, что там есть промежуточный слой). Я использую что-то типа объектно-реляционного преобразования. Это даже не запрос SQL, а запрос на уровне объектов хранилища. Этот запрос DQL, который разбирается на сервере, и там же преобразовывается в запрос SQL. А на будущее конечно буду отделать бизнес-логику от коннекта)
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34846418
324f4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Java Programmer


Итак - первое - хочу отметить, что первую свою проблему - вы решили ) все будет работать ) НО!

То есть при таком раскладе все будет работать корректно и данные коллекций не будут перемешиваться между потоками?? )
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34846567
kest_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
324f4То есть при таком раскладе все будет работать корректно и данные коллекций не будут перемешиваться между потоками?? )
Конечно. Локальный объект внутри метода создается каждым потоком независимо. Локальные переменные потокобезопасны по определению.
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34846779
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot 324f4]Привожу на вашу критику фрагмент кода, чтобы было понятно:

а разве в документуме IDfCollection автоматически не научились закрываться?:)
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34846790
324f4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
livehacker[quot 324f4]Привожу на вашу критику фрагмент кода, чтобы было понятно:

а разве в документуме IDfCollection автоматически не научились закрываться?:)
Неа)))
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34846862
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kest_ruКонечно. Локальный объект внутри метода создается каждым потоком независимо. Локальные переменные потокобезопасны по определению.
Это не совсем правда. Ведь не факт что объект на который ссылается локальная переменная не расшарен в другом потоке. Всё упирается в scope объекта. Где он был создан и где он стал доступным для GC.
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34848121
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz kest_ruКонечно. Локальный объект внутри метода создается каждым потоком независимо. Локальные переменные потокобезопасны по определению.
Это не совсем правда. Ведь не факт что объект на который ссылается локальная переменная не расшарен в другом потоке. Всё упирается в scope объекта. Где он был создан и где он стал доступным для GC.
В данном случае он создается внутри метода и никуда передается, так что будет потокобезопасно, хотя в общем замечание справедливо, конечно. Особенно если локальная переменная - ссылка на синглтон :)
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34848340
324f4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зашедший Blazkowicz kest_ruКонечно. Локальный объект внутри метода создается каждым потоком независимо. Локальные переменные потокобезопасны по определению.
Это не совсем правда. Ведь не факт что объект на который ссылается локальная переменная не расшарен в другом потоке. Всё упирается в scope объекта. Где он был создан и где он стал доступным для GC.
В данном случае он создается внутри метода и никуда передается, так что будет потокобезопасно, хотя в общем замечание справедливо, конечно. Особенно если локальная переменная - ссылка на синглтон :)
Извините, а сиглтон -это что??? Мелодия в мобильнике?))
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34849279
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
324f4Извините, а сиглтон -это что??? Мелодия в мобильнике?))
Да.
...
Рейтинг: 0 / 0
Вопрос по SingleThreadModel
    #34850331
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
324f4Извините, а сиглтон -это что??? Мелодия в мобильнике?))
Суть - музыка (минусовка) записывается в формате MIDI, а сверху накладывается песня. В итоге получаем гораздо меньшей размер, чем у MP3, плюс проигрывания качество обычно выше. Сейчас морально устаревает, т.к. мобильники переходят на новый формат - обсервер.
...
Рейтинг: 0 / 0
21 сообщений из 46, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по SingleThreadModel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]