powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / вопрос о потоках
25 сообщений из 26, страница 1 из 2
вопрос о потоках
    #34238460
denissh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
знающие, как решить проблему, подскажите пожалуйста...

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

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

если сильно глупый вопрос, то не бейте пожалуста ногами только, голова уже деревянная стала, как застопарился на этом, так и все встало:(
...
Рейтинг: 0 / 0
вопрос о потоках
    #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
вопрос о потоках
    #34238473
Тьфу, имел в виду:

Код: plaintext
1.
 if  (conn ==  null  || conn.isClosed()) {
...
Рейтинг: 0 / 0
вопрос о потоках
    #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
вопрос о потоках
    #34238478
denissh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще бы научиться так красиво вставлять в сообщения исходный код:)
...
Рейтинг: 0 / 0
вопрос о потоках
    #34238481
Пользуйтесь тегом [src]
...
Рейтинг: 0 / 0
вопрос о потоках
    #34238484
Разжевывать дальше?
Или всё понятно?
...
Рейтинг: 0 / 0
вопрос о потоках
    #34238486
Перезапуск потока — практика неправильная. Что вы будете делать, когда интерфейсов будет много и стейтментов будет много? Эффективнее будет их создавать при входе в интерфейс, а при выходе — убивать, правильно?
...
Рейтинг: 0 / 0
вопрос о потоках
    #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
вопрос о потоках
    #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
вопрос о потоках
    #34238492
denissh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
но если связь оборвалась из за интернета или еще чего...то мне нужно переконектиться....т.е. убить поток в котором я сейчас нахожусь и создать его заново
...
Рейтинг: 0 / 0
вопрос о потоках
    #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
вопрос о потоках
    #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
вопрос о потоках
    #34238524
denissh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо Anarion , сейчас попробую...
...
Рейтинг: 0 / 0
вопрос о потоках
    #34238541
Ахтунг, господа.
...
Рейтинг: 0 / 0
вопрос о потоках
    #34238543
Anarion
Оочень приблизительно. Но суть в том, что один поток у тебя постоянно спит, а второй его по необходимости дергает. Если второй поток не может нащупать соединение, он дергает первый и засыпает, а потом пробует снова.
Ахтунг, господа!
Зачем такие сложности???
...
Рейтинг: 0 / 0
вопрос о потоках
    #34238555
denissh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
(меня всё равно забанят) Anarion
Оочень приблизительно. Но суть в том, что один поток у тебя постоянно спит, а второй его по необходимости дергает. Если второй поток не может нащупать соединение, он дергает первый и засыпает, а потом пробует снова.
Ахтунг, господа!
Зачем такие сложности???

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

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

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

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

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

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


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