Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Выполнение запроса в потоке / 25 сообщений из 32, страница 1 из 2
20.10.2013, 15:59:22
    #38434582
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
Доброго дня господа !

Хочу выполнить запрос в потоке (чтобы не дуплить форму)

Элемент вызова - Button основной формы
Код: java
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.
public class MainFrame extends JFrame {
    ResultSet rsMain;
	
    public static void main(String[] args) {
              javax.swing.SwingUtilities.invokeLater(new Runnable() {
	      public void run() {
	             JFrame.setDefaultLookAndFeelDecorated(true);
		new MainFrame();
		}
	  });
    }

public MainFrame() {
    super("Window");
    final JButton      btExec  = new JButton("Выполнить");
    final DatabaseTableModel dtmMain = new DatabaseTableModel(true);
    JTable tbMain = new JTable(dtmMain);
    ..................
    btExec.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent e) {
	try {
                   Thread t1 = new Thread(new JDBCThread(tfPath.getText(),tfUser.getText(),tfWord.getText(),rsMain));
	      t1.start();
	      dtmMain.setDataSource(rsMain);   - здесь наверное нужно синхронизировать два потока
                 } catch (Exception Exp) {System.out.println("Произошла ошибка в визуализации: "+Exp);
                }
            }
            });
  plExec.add(btExec);



Это код потока
Код: java
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.
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;

public class JDBCThread implements Runnable{
  String Path,User,Word;
  ResultSet rsMain;
  
  JDBCThread(String Path,String User,String Word, ResultSet rsMain) {
	  this.Path = Path;
	  this.User = User;
	  this.Word = Word;
	  this.rsMain = rsMain;
	  }
 
  public void run(){
	  try {
		  Class.forName("oracle.jdbc.driver.OracleDriver");
		  Connection conn = DriverManager.getConnection(Path,User,Word);
		  Statement st = conn.createStatement();
		  rsMain = st.executeQuery("select * from DD10");
		  } catch (Exception e) {System.out.println("Произошла ошибка при выполнении: "+e);
		  }
	  }
  }



Это ошибка
Произошла ошибка в визуализации: java.lang.NullPointerExceptionВероятно необходимо правильно синхронизировать потоки и отклонировать ResultSet
(так как поток закончиться и соединение с базой закроеться)

Подскажите как правильно реализовать задачу.

Заранее благодарен !
...
Рейтинг: 0 / 0
20.10.2013, 16:02:26
    #38434587
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
...
Рейтинг: 0 / 0
20.10.2013, 21:31:52
    #38434794
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
HOME_X,
А что с формой собрался делать? Во время запроса? Закрыть?
...
Рейтинг: 0 / 0
21.10.2013, 00:20:58
    #38434914
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
Petro123HOME_X,
А что с формой собрался делать? Во время запроса? Закрыть?


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

Ну как в нормальных SQL Developeraх
...
Рейтинг: 0 / 0
21.10.2013, 00:59:58
    #38434936
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
Blazkowicz http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

Тему исследовал, насколько понял это тот же обьект только с некоторой интерпритацией
для пользователей

Рассматривал ситуация на примере ....
http://java.about.com/od/Tracking-Progress/ss/A-Progress-Bar-Example-Program.htm
- Изменение свойств и методов главного окна осуществляеться непосредственно ссылкой
(это не совсем красиво в отношении ООП).

Код: javascript
1.
  	 progressBar.setValue(chunk);


где progressBar - обьект главного потока
Chuck - счетчик допол. потока

У меня другая ситуация - необходимо вернуть ResultSet
- как его заполнить для главного обьекта
- присвоение его типа DatabaseTableModel

Не могли бы показать как это реализовать на моем коде

P.S. - попутный вопрос (из статьи)
Код: javascript
1.
2.
 protected void process(List chunks) {
         for (Integer chunk : chunks)


Здесь же должно быть приведени типов ?
уточните синтаксис пожалуйста for (Integer chunk : chunks)
...
Рейтинг: 0 / 0
21.10.2013, 03:51:18
    #38434972
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
HOME_X,

В окончательном варианте имею
Следующий вызов
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
btExec.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
        try {
	   (new Thread(new JDBCThread(tfPath.getText(),tfUser.getText(),tfWord.getText(),dtmMain))).start();
	} catch (Exception Ex) 
            {
                System.out.println("Произошла ошибка в визуализации: "+Ex);
             }
    }
    }



Следующий поток
Код: java
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.
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;

public class JDBCThread implements Runnable{
  String Path,User,Word;
  DatabaseTableModel dtmMain;
  
  JDBCThread(String Path,String User,String Word,DatabaseTableModel dtmMain) {
	  this.Path = Path;
	  this.User = User;
	  this.Word = Word;
	  this.dtmMain = dtmMain;
	  }
 
  public void run(){
	  try {
		  Class.forName("oracle.jdbc.driver.OracleDriver");
		  Connection conn = DriverManager.getConnection(this.Path, this.User, this.Word);
		  Statement st = conn.createStatement();
		  this.dtmMain.setDataSource(st.executeQuery("select * from DD10"));
		  conn.close();
		  } catch (Exception e) {System.out.println("Произошла ошибка в запросе: "+e);
		  }
	  }
  }



Оцените верно ли решение ?
Заранее благодарен !
...
Рейтинг: 0 / 0
21.10.2013, 10:01:07
    #38435086
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
HOME_XТему исследовал, насколько понял это тот же обьект только с некоторой интерпритацией
для пользователей

Ну, раз исследовал, то вот это, наверное тоже понимаешь
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/
...
Рейтинг: 0 / 0
21.10.2013, 10:47:29
    #38435150
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
HOME_XОцените верно ли решение ?

Нет.
- Переменные не принято называть с заглавной буквы.
- Это не нужно делать каждый раз - Class.forName("oracle.jdbc.driver.OracleDriver");
- Это отнимает достаточно много времени - DriverManager.getConnection(Path,User,Word);
- Это будет приводить к случайным и необхяснимым ошибкам this.dtmMain.setDataSource(...)
- Statement не закрывается, Connection закрывается почему-то не в блоке finally. Когда закрывается ResultSet - не понятно вообще. Всё это приведет к утечкам памяти.
- new Thread().start() хоть и не значительно, но медленнее чем запуск через ThreadPoolExecutor
...
Рейтинг: 0 / 0
21.10.2013, 10:59:28
    #38435169
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
BlazkowiczHOME_XОцените верно ли решение ?

- Это не нужно делать каждый раз - Class.forName("oracle.jdbc.driver.OracleDriver");

тоже полезно для чтения
http://www.javaworld.com/javaqa/2003-06/01-qa-0606-load.html
...
Рейтинг: 0 / 0
21.10.2013, 14:40:27
    #38435577
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
Blazkowicz - Переменные не принято называть с заглавной буквы.
Согласен - правило хорошего тона !

Blazkowicz - Это не нужно делать каждый раз - Class.forName("oracle.jdbc.driver.OracleDriver");

Заменено - import oracle.jdbc.driver.OracleDriver;

Blazkowicz - Это отнимает достаточно много времени - DriverManager.getConnection(Path,User,Word);

Не понял - мне не надо держать канал открытым - сделал запрос - вернул данные - закрыл канал!
Как Вы видите более оптимально ?

Blazkowicz - Это будет приводить к случайным и необхяснимым ошибкам this.dtmMain.setDataSource(...)

ССогласен - это для меня главный вопрос -"..как синхронизироватьь данные потока и главной формы.."
Ответ на него я пока не нашел - уточните пожалуйста ПРАВИЛЬНЫМ синтаксисом !

Blazkowicz - Statement не закрывается, Connection закрывается почему-то не в блоке finally. Когда закрывается ResultSet - не понятно вообще. Всё это приведет к утечкам памяти.

Согласен - устранено !

Blazkowicz - new Thread().start() хоть и не значительно, но медленнее чем запуск через ThreadPoolExecutor

Пока - пусть так останеться, хочу понять главное о синхронизации !

Результат Ваших замечаний приложен
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
		btExec.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
	             if (cbKind.isSelected()==false){
	 				try {
	 					new JDBCSelect(tfPath.getText(),tfUser.getText(),tfWord.getText(),dtmMain);
				    } catch (Exception Ex) {System.out.println("Произошла ошибка в визуализации: "+Ex);
	                }
	             } else {
	 				try {
	 					(new Thread(new JDBCThread(tfPath.getText(),tfUser.getText(),tfWord.getText(),dtmMain))).start();
					} catch (Exception Ex) {System.out.println("Произошла ошибка в визуализации: "+Ex);
	                }
	             }
			}
			});



Код: java
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.
package ConnectAndChange;

import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import oracle.jdbc.driver.OracleDriver;

public class JDBCSelect {
  
  JDBCSelect(String sPath,String sUser,String sWord,DatabaseTableModel dtmMain) {
	  try {
		  Connection conn = DriverManager.getConnection(sPath,sUser,sWord);
		  Statement st = conn.createStatement();
		  dtmMain.setDataSource(st.executeQuery("select * from DD10"));
		  st.close();
		  conn.close();
		  } catch (Exception e) {System.out.println("Произошла ошибка в запросе: "+e);
		  }
	  }
  }

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

package ConnectAndChange;

import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;

public class JDBCThread implements Runnable{
  String sPath,sUser,sWord;
  DatabaseTableModel dtmMain;
  
  JDBCThread(String sPath,String sUser,String sWord,DatabaseTableModel dtmMain) {
	  this.sPath = sPath;
	  this.sUser = sUser;
	  this.sWord = sWord;
	  this.dtmMain = dtmMain;
	  }
 
  public void run(){
	  new JDBCSelect(sPath,sUser,sWord,dtmMain);
	  }
  }
...
Рейтинг: 0 / 0
21.10.2013, 14:54:58
    #38435606
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
такой такой код читать сил нет, всё равчно что эпилептические картинки смотреть.
по поводу синхронизации - всё просто. Есть один единственный поток EDT, в котором работает Swing.
Когда вы читаете данные в другом потоке, вам надо их как-то передать обратно в Swing UI (обновить view). Но, если вы это сделатете в другом потоке, могут возникать случайные exception-ы. Swing компоненты, почти все, не расчитаны на многопоточность.
Поэтому обновлять UI, нужно оборачивая код в SwingUtilities.invokeLater или SwingUtilities.invokeAndWait.
В SwingWorker уже используются вышеуказаные методы.

Это всё новичку сходу понять не просто. Надо разбираться.
...
Рейтинг: 0 / 0
21.10.2013, 15:01:44
    #38435622
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
Blazkowicz http://docs.oracle.com/javase/tutorial/uiswing/concurrency/


Честно говоря далеко не все понятно ! (в Java недавно и как механизм так и синтаксис неясен)
Кратко прокоментировать пожалуйста следующий код
Код: java
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.
private static class FlipPair {
    private final long heads, total;

    FlipPair(long heads, long total) {
        this.heads = heads;
        this.total = total;
    }
}

private class FlipTask extends SwingWorker<Void, FlipPair> {
@Override
protected Void doInBackground() {
    long heads = 0;
    long total = 0;
    Random random = new Random();
    while (!isCancelled()) {
        total++;
        if (random.nextBoolean()) {
            heads++;
        }
        publish(new FlipPair(heads, total));
    }
    return null;
}
Описали стат. класс FlipPair
publish(new FlipPair(heads, total)); - cоздаем и публикуем его ?????
Зачем доп. класс для хранения инфо - почему не писать непосредственон ?

protected void process(List<FlipPair> pairs) {
    FlipPair pair = pairs.get(pairs.size() - 1);
    headsText.setText(String.format("%d", pair.heads));
    totalText.setText(String.format("%d", pair.total));
    devText.setText(String.format("%.10g", ((double) pair.heads)/((double) pair.total) - 0.5));

Пишем его значение НАПРЯМУЮ в поля головной формы  !??????
при этом СИНХРОНИЗУРУЯ момент ввода 

Поясните пожалуйста 
...
Рейтинг: 0 / 0
21.10.2013, 15:09:24
    #38435643
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
BlazkowiczВ SwingWorker уже используются вышеуказаные методы.


Поетому Вы и предложили мне этот класс SwingWorker
Понято - принято - спасибо !
ЦЕННО !

На каком этапе присходит такая синхронизация ?
Исходя из листинга - могу предположить - publish(new FlipPair(heads, total));
Но не совсем понимаю !!!!

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
private class FlipTask extends SwingWorker<Void, FlipPair> {
@Override
protected Void doInBackground() {
    long heads = 0;
    long total = 0;
    Random random = new Random();
    while (!isCancelled()) {
        total++;
        if (random.nextBoolean()) {
            heads++;
        }
        publish(new FlipPair(heads, total));
    }
    return null;
}
...
Рейтинг: 0 / 0
21.10.2013, 15:16:36
    #38435660
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
HOME_XИсходя из листинга - могу предположить - publish(new FlipPair(heads, total));


Пардон !!!
Наверное внутри класса, это более логично !
protected void process(List<FlipPair> pairs)

Но зачем еще класса и доп метод ?

FlipPair(long heads, long total) {
private class FlipTask extends SwingWorker<Void, FlipPair> {

Почему нельзя считать Random прамо в
protected void process ????
...
Рейтинг: 0 / 0
21.10.2013, 15:18:46
    #38435668
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
HOME_XИсходя из листинга - могу предположить - publish(new FlipPair(heads, total));


Пардон !!!
Наверное внутри класса, это более логично !
protected void process(List<FlipPair> pairs)

Но зачем еще класса и доп метод ?

FlipPair(long heads, long total)
Код: java
1.
protected Void doInBackground() 


Почему нельзя считать Random прамо в
protected void process ????
...
Рейтинг: 0 / 0
21.10.2013, 15:22:04
    #38435676
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
Постарайтесь писать поменьше вопросительных и восклицательных знаков и сконцентрировать на более внятной формулировке вопросов. Потому что понятно что вам ничего не понятно, то что конкретно не понятно - не понятно.
1) Методы setText() нельзя вызывать в фоновом потоке.
2) Если while(true)(Random.next();) сделать не фоновом потоке, а в EDT, то GUI перестанет работать, так как он работает только в EDT, который на данный момент занят бесконечным циклом.
...
Рейтинг: 0 / 0
21.10.2013, 17:15:48
    #38435882
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
Blazkowicz.
1) Методы setText() нельзя вызывать в фоновом потоке.
2) Если while(true)(Random.next();) сделать не фоновом потоке, а в EDT, то GUI перестанет работать, так как он работает только в EDT, который на данный момент занят бесконечным циклом.


Т.к. - синхронизацией занимаеться именно "void process"
Принято - осознано !

А обособленный класс FlipPair - реализован для синхронизации ДВУХ и больше переменных в одной записи (итерации цикла)
так как идет публикация и фиксация двух значений(выбираем последнее значение в семействе)
Код: java
1.
2.
protected void process(List<FlipPair> pairs) {
    FlipPair pair = pairs.get(pairs.size() - 1);


В ином случае значение переменные total;heads могли бы быть из разных итераций цикла.
Верно ли Вас понял ?

Blazkowicz - Это будет приводить к случайным и необхяснимым ошибкам this.dtmMain.setDataSource(...)

Вопрос закрыт переделаю под класс SwingWorker

Blazkowicz - Это отнимает достаточно много времени - DriverManager.getConnection(Path,User,Word);

Не понял - мне не надо держать канал открытым - сделал запрос - вернул данные - закрыл канал
Как Вы видите более оптимально ?

Blazkowicz.
понятно что вам ничего не понятно

Вы абсолютно верно заметили
Мне действительно далеко не все понятно (синтаксис в том числе) - спасибо за пояснение !
...
Рейтинг: 0 / 0
23.10.2013, 01:27:55
    #38437784
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
Уважаемый Blazkowicz !

Попытался изобразить свой класс на основании Вашего примера
Вроде работает - досмотрите пожалуйста верно ли понял суть

Код: java
1.
new JDBCSwingThread(tfPath.getText(),tfUser.getText(),tfWord.getText(),dtmMain);



Код: java
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.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;
import javax.swing.SwingWorker;

public class JDBCSwingThread {

	public JDBCSwingThread(String sPath,String sUser,String sWord,DatabaseTableModel dtmMain){
    	(new ExecuteQuery(sPath,sUser,sWord,dtmMain)).execute();
	}
    		     		
    private static class ExitQuery {
        private final ResultSet rsSet;
        private final Connection cnCon;
        
        ExitQuery(ResultSet rsSet,Connection cnCon) {
        	this.rsSet = rsSet;
        	this.cnCon = cnCon;
        }
    }

    private class ExecuteQuery extends SwingWorker<Void, ExitQuery> {
    	String sPath,sUser,sWord;
    	DatabaseTableModel dtmMain;
        private Connection cnCon;
    	private ResultSet rsSet;
       
    	
    	public ExecuteQuery(String sPath,String sUser,String sWord,DatabaseTableModel dtmMain){
        	this.sPath = sPath;
        	this.sUser = sUser;
        	this.sWord = sWord;
        	this.dtmMain = dtmMain;
    	}

        protected Void doInBackground() {
    		try {
    			cnCon = DriverManager.getConnection(this.sPath,this.sUser,this.sWord);
    			Statement st = cnCon.createStatement();
    			rsSet = st.executeQuery("select * from DD10");
    			} catch (Exception e) {System.out.println("Произошла ошибка в запросе: "+e);
    			}
    		publish(new ExitQuery(rsSet,cnCon));
    		return null;
        }

        protected void process(List<ExitQuery> lItem) {
        	ExitQuery Item = lItem.get(lItem.size() - 1);
        	try{
        		this.dtmMain.setDataSource(Item.rsSet);
        		Item.rsSet.close();
        		Item.cnCon.close();
        		} catch(Exception e) {}
        	}
        }
    }



Заранее благодарен !
...
Рейтинг: 0 / 0
23.10.2013, 02:31:55
    #38437789
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
ну и где закрытие resultSet and connection?
...
Рейтинг: 0 / 0
23.10.2013, 09:15:48
    #38437847
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
HOME_XPetro123HOME_X,
А что с формой собрался делать? Во время запроса? Закрыть?


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

Ну как в нормальных SQL Developeraх
у меня как-то все запрос были по 2-5 сек. Что никак не нервировало пользователя и не заставляло его играться ещё чем-то.
А асинхронные вещи писать не так просто..... для одной головы пользователя.
imho
...
Рейтинг: 0 / 0
23.10.2013, 19:57:11
    #38438962
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
забыл никну и где закрытие resultSet and connection?

protected void process(List<ExitQuery> lItem) {
ExitQuery Item = lItem.get(lItem.size() - 1);
try{
this.dtmMain.setDataSource(Item.rsSet);
Item.rsSet.close();
Item.cnCon.close();
} catch(Exception e) {}
}
}
}


Необходимо сначала передать данные в головную форму,
this.dtmMain.setDataSource(Item.rsSet);
а после закрыть канал, следовательно делаю так.

Если неверно думаю, исправьте - буду признателен за помощь !
...
Рейтинг: 0 / 0
23.10.2013, 20:01:44
    #38438967
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
Petro123А асинхронные вещи писать не так просто.....


Согласен с Вами - геморой !
"Прямой" код намного приятен в отладке и надежен

А если запрос достаточно длителен - тогда как ?

Все равно без потоков все равно никуда не деться, цель понял
как делать и какие инструментами

Благодарен за ответ !
...
Рейтинг: 0 / 0
23.10.2013, 20:12:51
    #38438977
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
HOME_X,

Господа знатоки подскажите можно ли обойтись без "обертки" class JDBCSwingThread

Т.е. описать "возвратный" класс ExitQuery внтури ExecuteQuery, сделав предварительную ссылку
Ряд софтов ОПП это позволяет

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
   [SIZE=2]class ExitQuery;[/SIZE] - говорю что это класс, а описываю его внутри родителя 
   который его возвращает. 

   public class ExecuteQuery extends SwingWorker<Void, [SIZE=2]ExitQuery[/SIZE]> {
    	String sPath,sUser,sWord;
    	DatabaseTableModel dtmMain;
        private Connection cnCon;
    	private ResultSet rsSet;

    - теперь описание 
    private static class [SIZE=2]ExitQuery[/SIZE] {
        private final ResultSet rsSet;
        private final Connection cnCon;
        
        ExitQuery(ResultSet rsSet,Connection cnCon) {
        	this.rsSet = rsSet;
        	this.cnCon = cnCon;
        }
    }
    . . . . . . .  . . . . . .       



Заранее благодарен !
...
Рейтинг: 0 / 0
23.10.2013, 20:40:44
    #38439009
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
HOME_X,

В чем проблема завернуть несколько значений объединенных одним признаком в класс. Ну, передайте HashMap, если такая проблема класс создать.
Кстати, я вспомнил про способ сделать тоже самое без SwingWorker. Он появился в Java 7. Называется SecondaryLoop.
Код можно сделать немного проще чем со SwingWorker, но всё равно как-то нужно передать значения из JDBC потока... Хотя и это можно обойти через SwingUtilities.invokeLater(Runnable) - оберните все методы setText внутри вашего потока в этот Runnable.
...
Рейтинг: 0 / 0
23.10.2013, 20:59:28
    #38439020
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запроса в потоке
Blazkowicz,

Да проблем нет - интересуюсь возможностями !
Люблю "КРАСИВЫЙ" код (красиво это когда нет ничего лишнего)

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


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