Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / вопрос о потоках / 25 сообщений из 26, страница 1 из 2
05.01.2007, 15:36:51
    #34238460
denissh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
знающие, как решить проблему, подскажите пожалуйста...

создаю окошко с 2 кнопками, конект и дисконект.

перед конектом, создается новый поток для работы с sql, приложение конектится к sql серверу.
перед выполнением каждого запроса, приложение проверяет, не оборвалась ли связь, если нет, то соответственно выполняется запрос. А вот если связь пропала, мне соответственно нужно опять соединиться....соединение у меня происходит в run(), т.е. при старте потока,
как мне быть? убить текущий поток и создать новый? (если так можно, то подскажите примерчиком пожалуста) или можно както более лучше это реализовать.

если сильно глупый вопрос, то не бейте пожалуста ногами только, голова уже деревянная стала, как застопарился на этом, так и все встало:(
...
Рейтинг: 0 / 0
05.01.2007, 15:42:49
    #34238470
вопрос о потоках
Напиши пул коннектов. Или совсем тупой метод:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 private  Connection conn =  null ;

 public  Connection getConnection() {
  if  (conn ==  null  && conn.isClosed()) {
  conn = DriverManager.getConnection(...., ...); // как там у тебя коннект берется
 }
  return  conn;
}

При каждом обращении к коннекту - получай его через этот метод.
...
Рейтинг: 0 / 0
05.01.2007, 15:43:27
    #34238473
вопрос о потоках
Тьфу, имел в виду:

Код: plaintext
1.
 if  (conn ==  null  || conn.isClosed()) {
...
Рейтинг: 0 / 0
05.01.2007, 15:45:19
    #34238474
denissh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
вот мой примерчик

...
...
здесь идет конструктор окна с кнопками...
...
...
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(e.getSource() == disconnectButton) {
sql.stopThread();
sql.disconnect();
frame.setIconImage(stopIcon);

disconnectButton.setEnabled(false);
connectButton.setEnabled(true);
}else{
if(e.getSource() == connectButton){
sql.connect();
frame.setIconImage(startIcon);

connectButton.setEnabled(false);
disconnectButton.setEnabled(true);...
...другие кнопки
...

класс SQL

...
...
public void stopThread()
{
ct.interrupt();
}

public void connect()
{
ct = new ConnectThread();
ct.start();
}...
...

class ConnectThread extends Thread
{
public void run()
{
try
{
while (!interrupted() && !connecting())
{
event.write("SQL: (302); Will triing to connect to IMC SERVER after 10 seconds ");
sleep(10000);
}
}
catch(InterruptedException exception)
{
event.write("SQL: (304); Thread stopped - "+exception);
}
}
}



public boolean connecting()
{
try
{
conn = DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/xxx;User=xxx;Password=xxx");
if (conn.isClosed()==false)
{
event.write("SQL: (316); Connection to IMC SERVER established");
return true;
}
else
return false;
}
catch(Exception e)
{
event.write("SQL: (324); Error establishing connection to IMC SERVER " + e);
return false;
}
}

вся проблема возникает при вызове

public boolean getsql(String sql)
{
try
{
if (conn.isClosed())
connect(); ////<-------------------

if (stmt == null)
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
return true;
}
catch(Exception e)
{
connect();
return false;
}
}
...
Рейтинг: 0 / 0
05.01.2007, 15:46:11
    #34238478
denissh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
еще бы научиться так красиво вставлять в сообщения исходный код:)
...
Рейтинг: 0 / 0
05.01.2007, 15:47:59
    #34238481
вопрос о потоках
Пользуйтесь тегом [src]
...
Рейтинг: 0 / 0
05.01.2007, 15:48:37
    #34238484
вопрос о потоках
Разжевывать дальше?
Или всё понятно?
...
Рейтинг: 0 / 0
05.01.2007, 15:49:38
    #34238486
вопрос о потоках
Перезапуск потока — практика неправильная. Что вы будете делать, когда интерфейсов будет много и стейтментов будет много? Эффективнее будет их создавать при входе в интерфейс, а при выходе — убивать, правильно?
...
Рейтинг: 0 / 0
05.01.2007, 15:53:47
    #34238489
denissh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
Код: 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.
   public   void  connect()
  {
    ct =  new  ConnectThread();
    ct.start();
  }



   class  ConnectThread  extends  Thread
  {
     public   void  run()
    {
       try 
      {
         while  (!interrupted() && !connecting())
        {
          event.write("SQL: (302); Will triing to connect to IMC SERVER after 10 seconds ");
          sleep( 10000 );
        }

      }
       catch (InterruptedException exception)
      {
        event.write("SQL: (304); Thread stopped - "+exception);
      }
    }
  }


   public   boolean  connecting()
  {
     try 
    {
      conn = DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/xxx;User=xxx;Password=xxx");
       if  (conn.isClosed()==false)
      {
        event.write("SQL: (316); Connection to IMC SERVER established");
         return  true;
      }
       else 
         return  false;
    }
     catch (Exception e)
    {
      event.write("SQL: (324); Error establishing connection to IMC SERVER " + e);
       return  false;
    }
  }

спасибо Guest

если не затруднит, то дальше разжевывать....
меня интересует больше как сделать это в потоке
...
Рейтинг: 0 / 0
05.01.2007, 15:55:18
    #34238491
denissh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
при выходе я и поток и стейтмент убиваю

Код: 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.
   public   void  disconnect()
  {

     if (rs !=  null )
    {
       try 
      {rs.close();}
       catch (SQLException sqlEx)
      {
        event.write("SQL error: (373),: " + sqlEx);
      }
      rs =  null ;
    }
     if (stmt !=  null )
    {
       try 
      {stmt.close();}
       catch (SQLException sqlEx)
      {
        event.write("SQL error: (385),: " + sqlEx);
      }
      stmt =  null ;
    }
     if (conn !=  null )
    {
       try 
      {conn.close();}
       catch (SQLException sqlEx)
      {
        event.write("SQL error: (397),: " + sqlEx);
      }
      conn =  null ;
    }
    event.write("SQL: (334); Disconnecting from IMC SERVER...OK");

  }

   public   void  stopThread()
  {
    ct.interrupt();
  }

...
Рейтинг: 0 / 0
05.01.2007, 15:56:30
    #34238492
denissh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
но если связь оборвалась из за интернета или еще чего...то мне нужно переконектиться....т.е. убить поток в котором я сейчас нахожусь и создать его заново
...
Рейтинг: 0 / 0
05.01.2007, 15:59:06
    #34238501
denissh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 public   boolean  getsql(String sql)
{
 try 
{
 if  (conn.isClosed())
connect(); ////<-------------------

 if  (stmt ==  null )
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
 return  true;
}
 catch (Exception e)
{
connect();
 return  false;
}
}

запросы я выполняю вот так из созданного потока
...
Рейтинг: 0 / 0
05.01.2007, 16:00:13
    #34238502
Anarion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
Поток 1:

Код: 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.
 class  Thread1  implements  Runnable{
 boolean  running=true;
 boolean  isConnected=false;

 public  connectionNeed(){
isConnected=false;
}


 public   void  run(){
 while (running){

 try  {
		 Class .forName(driver);
		DriverManager.setLoginTimeout(loginTimeout);
		connection = DriverManager.getConnection(url, user, password);
                isConnected=true;
 		}  catch  (ClassNotFoundException e) {
			e.printStackTrace();
		}  catch  (SQLException e) {
			e.printStackTrace();
		}

 while (isConnected==true){
sleep( 1000 );
}
}
}
}

Поток 2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
....
 while  (queryExecuted=false){
 try {
...
rs = statement.executeQuery(query);
...
queryExecuted=true;
}  catch  (SQLException e) { 
         Thread1.connectionNeed();
         sleep( 10000 );
}
}
}
}


Оочень приблизительно. Но суть в том, что один поток у тебя постоянно спит, а второй его по необходимости дергает. Если второй поток не может нащупать соединение, он дергает первый и засыпает, а потом пробует снова.
...
Рейтинг: 0 / 0
05.01.2007, 16:11:40
    #34238524
denissh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
спасибо Anarion , сейчас попробую...
...
Рейтинг: 0 / 0
05.01.2007, 16:21:46
    #34238541
вопрос о потоках
Ахтунг, господа.
...
Рейтинг: 0 / 0
05.01.2007, 16:23:41
    #34238543
вопрос о потоках
Anarion
Оочень приблизительно. Но суть в том, что один поток у тебя постоянно спит, а второй его по необходимости дергает. Если второй поток не может нащупать соединение, он дергает первый и засыпает, а потом пробует снова.
Ахтунг, господа!
Зачем такие сложности???
...
Рейтинг: 0 / 0
05.01.2007, 16:31:25
    #34238555
denissh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
(меня всё равно забанят) Anarion
Оочень приблизительно. Но суть в том, что один поток у тебя постоянно спит, а второй его по необходимости дергает. Если второй поток не может нащупать соединение, он дергает первый и засыпает, а потом пробует снова.
Ахтунг, господа!
Зачем такие сложности???

есть вариант проще?:)
...
Рейтинг: 0 / 0
05.01.2007, 16:34:49
    #34238560
вопрос о потоках
denissh
есть вариант проще?:)
Конечно, есть.
Зачем тебе отдельный поток для работы с СУБД? Что это дает, если ты всё-равно при ошибки подключения сидишь как дундук и ждешь, пока не появится коннект?

Сделай статический класс с синхронизированными методами и будет табе щястье.
...
Рейтинг: 0 / 0
05.01.2007, 16:35:04
    #34238561
вопрос о потоках
*при ошибке
...
Рейтинг: 0 / 0
05.01.2007, 16:38:32
    #34238570
denissh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
(меня всё равно забанят)
Сделай статический класс с синхронизированными методами и будет табе щястье.

а пока конекта нету, интерфейс с кнопочками будет висеть в пространстве, да?
...
Рейтинг: 0 / 0
05.01.2007, 16:53:54
    #34238600
вопрос о потоках
denissh
а пока конекта нету, интерфейс с кнопочками будет висеть в пространстве, да?
Сколько времени занимает установка соединения?
...
Рейтинг: 0 / 0
05.01.2007, 16:54:47
    #34238601
вопрос о потоках
И как часто производится подобное переподключение?
...
Рейтинг: 0 / 0
05.01.2007, 17:01:43
    #34238608
denissh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
(меня всё равно забанят)И как часто производится подобное переподключение?

если с нетом нормально, то секунд 10...
часто бывают проблемы с нетом, вырубают минут на 10-20 сетевики, иногда sql вырубаем, бывает комп перегружается и прочее

только начал делать прогу, думал что все просто, и все работало...пока рубанули инет, и не понял что нужно делать в другом потоке:(
...
Рейтинг: 0 / 0
05.01.2007, 17:05:16
    #34238612
Anarion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
автора пока конекта нету, интерфейс с кнопочками будет висеть в пространстве, да?
Если коннект очень медленный, то лучше тогда выводить окно, что типа "я стараюсь" и идти делать коннект. С потоками, которые зависят друг от друга связываться себе дороже.
Тебе придется тогда предусмотреть случай, когда коннект невозможен (злой админ вырубил инет), отмену коннекта (надоело ждать), плюс синхронизировать их не на sleep а на wait, плюс обрабатывать возможность падения первого потока. В общем, оно тебе нужно?
...
Рейтинг: 0 / 0
05.01.2007, 17:07:59
    #34238618
denissh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о потоках
AnarionЕсли коннект очень медленный, то лучше тогда выводить окно, что типа "я стараюсь" и идти делать коннект. С потоками, которые зависят друг от друга связываться себе дороже.
Тебе придется тогда предусмотреть случай, когда коннект невозможен (злой админ вырубил инет), отмену коннекта (надоело ждать), плюс синхронизировать их не на sleep а на wait, плюс обрабатывать возможность падения первого потока. В общем, оно тебе нужно?

емое.....так а как можно сделать подругому, пользователь даже не сможет закрыть окошко, пока конект не появиться????
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / вопрос о потоках / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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