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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сервлет 
:(
    Опции темы
lavan
Дата 23.6.2011, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

public ConnectionToDatabase(){
    con=null;
    st=null;
    rs=null;
    is_allive=false;
    init=false;
}

Некоторые методы
Код

public int getMyResult(String str)throws SQLException{
    if(st.execute(str)){//проверяем был запрос выборкой или обновлением
        if(!init){
            is_allive=true;
            init=true;
        }
        ObjectResultSet(str);
        return -2;
    }
    else{
        if(!init){//esli eto pervoe podklychenie
            is_allive=false;//to zadaem nyjnie parametri
            init=true;
        }
        return ValueOfUpdate(str);
    }
}
synchronized public void ObjectResultSet(String str)throws SQLException
{//bil zapros na viborky
    while(!is_allive)
        try{
            wait();
        }catch(InterruptedException e){
            System.out.print(e.getMessage());
        }
    rs=st.executeQuery(str);
    is_allive=false;
    notify();
}
synchronized public int ValueOfUpdate(String str)throws SQLException
{//bil zapros na obnovleniya
    while(is_allive)
        try{
            wait();
        }catch(InterruptedException e){
            System.out.print(e.getMessage());
        }
    is_allive=true;
   st.executeUpdate(str);
   notify();
        return st.getUpdateCount();
}

Метод doGet()
Код

if(db.getMyResult("select login,first_name,password,post,"+
                 " second_name from user")==-2)
             rs=db.getMyResultset();
            while(rs.next())...

Проблема такая:Когда первый раз запускаю сервлет(через netbeans+tomcat) все отрабатывает,а а если запускаю второй раз(не новое подсоединение,а перезапускаю сервлет без выхода из netbeans) то не преходит на нужную страницу(зависает на странице регистрации) причем если выполнять в отладочном режиме все работает нормально.Если перезапустить netbeans то 1 раз отрабатывает нормално а потом снова та же история.
Народ,подскажите в чем проблема
PM MAIL   Вверх
powerOn
Дата 23.6.2011, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 28
Всего: 159



Модератор: Название темы должно отражать ее суть!


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
jk1
Дата 23.6.2011, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 5
Всего: 75



Цитата

причем если выполнять в отладочном режиме все работает нормально


Это первый признак проблемы управления потоками.

Вы не могли бы пояснить, зачем нужен вот этот ужас:
Код

 try{
            wait();
        }catch(InterruptedException e){
            System.out.print(e.getMessage());
        }


За вас по идее контейнер должен осуществлять менеджмент потоков.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
lavan
Дата 23.6.2011, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

try{
            wait();
        }catch(InterruptedException e){
            System.out.print(e.getMessage());
        }


Добавлено через 4 минуты и 15 секунд
Цитата

За вас по идее контейнер должен осуществлять менеджмент потоков.

вы имеете в виду,что мне просто надо сделать синхронизирующие блоки,а контейнер все остальное сделает сам?
PM MAIL   Вверх
jk1
Дата 24.6.2011, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 5
Всего: 75



Цитата

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


Если уж вы решили уводить потоки в wait(), тогда вызывайте notify(). А то получается что вы их приостанавливаете и не возобновляете.

Цитата

вы имеете в виду,что мне просто надо сделать синхронизирующие блоки,а контейнер все остальное сделает сам? 


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


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
lavan
Дата 24.6.2011, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



так я его вызываю
Код

synchronized public void ObjectResultSet(String str)throws SQLException
{//bil zapros na viborky
    while(!is_allive)
        try{
            wait();
        }catch(InterruptedException e){
            System.out.print(e.getMessage());
        }
    rs=st.executeQuery(str);
    is_allive=false;
    notify();//будим поток выполняющий ValueOfUpdate
}
synchronized public int ValueOfUpdate(String str)throws SQLException
{//bil zapros na obnovleniya
    while(is_allive)
        try{
            wait();
        }catch(InterruptedException e){
            System.out.print(e.getMessage());
        }
    is_allive=true;
   st.executeUpdate(str);
   notify();//будим поток выполняющий ObjectResultSet
        return st.getUpdateCount();
}


Т.е если я правильно понял то работа с б.д полностью реентерабельна на уровне системы?(б.д берет все на себя) и мне вообще можно исключить синхронизацию? И если да,то можете мне указать где в моей регулировке потоками ошибка?и почему в первый раз она все таки срабатывает?
PM MAIL   Вверх
jk1
Дата 24.6.2011, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 5
Всего: 75



Цитата

И если да,то можете мне указать где в моей регулировке потоками ошибка?и почему в первый раз она все таки срабатывает? 


Мое предположение в том, что с первого раза что-то остается залоченым. Но без полного кода сказать сложно.

Цитата

Т.е если я правильно понял то работа с б.д полностью реентерабельна на уровне системы?(б.д берет все на себя) и мне вообще можно исключить синхронизацию?


Мне не очень понятен термин "реентерабельно". Если вы боитесь, что операции чтения и апдейта могут друг другу мешать - зря боитесь. Для более глубокого понимания почиатйте про транзакции и уровни их изоляции.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
lavan
Дата 25.6.2011, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Тогда вопрос по транзакциям.Пусть есть
Код

try {
      con.setAutoCommit(false);
       ValueOfUpdate(String str);//запрс на выборку
}
   catch (SQLException ex) {
      ex.printStackTrace();
      try {
         System.out.println("Transaction failed.");
         con.rollback();
      }
      catch (SQLException se) {
         se.printStackTrace();
      }

Являются ли транзакции атомарными для потоков?
И если произошел откат,то что происходит после вызова con.rollback() кроме
того,что данные останутся неизмененными?Куда деваются данные которые ввели
пользователи в разных потоках? 
PM MAIL   Вверх
jk1
Дата 26.6.2011, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 5
Всего: 75



Цитата

Являются ли транзакции атомарными для потоков?

Транзакции атомарны по определению. Для каждого потока в Ваших условиях будет отдельная транзакция. Изменения, сделанные потоком А будут видны потоку B только после коммита транзакции А.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
lavan
Дата 27.6.2011, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И все таки,куда передается управление после rollback();?куда деваются данные введенные пользователем?Ведь он ждет результат,а произошел откат.Как обрабатывается такая ситуация и кем?(а с потоками я разобрался,пока что все работает на потоках)
PM MAIL   Вверх
jk1
Дата 27.6.2011, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 5
Всего: 75



Цитата

И все таки,куда передается управление после rollback();?

Никуда, остается там же, где и было. Не смешивайте понятие потока и ассоциированной с потоком транзакции. Откат транзакции приведет к тому, что данные в базе не изменятся. А поток тем временем спокойно продолжит выполнение.

Цитата

Как обрабатывается такая ситуация и кем?

Вами она и обрабатывается. После вызова rollback() обычным порядком возвращаете пользователю сообщение об ошибке.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
lavan
Дата 27.6.2011, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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


 




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


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

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