powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Выполнение запроса в потоке
32 сообщений из 32, показаны все 2 страниц
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #38434587
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #38434794
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
А что с формой собрался делать? Во время запроса? Закрыть?
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #38434914
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123HOME_X,
А что с формой собрался делать? Во время запроса? Закрыть?


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

Ну как в нормальных SQL Developeraх
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #38435086
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XТему исследовал, насколько понял это тот же обьект только с некоторой интерпритацией
для пользователей

Ну, раз исследовал, то вот это, наверное тоже понимаешь
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #38435606
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такой такой код читать сил нет, всё равчно что эпилептические картинки смотреть.
по поводу синхронизации - всё просто. Есть один единственный поток EDT, в котором работает Swing.
Когда вы читаете данные в другом потоке, вам надо их как-то передать обратно в Swing UI (обновить view). Но, если вы это сделатете в другом потоке, могут возникать случайные exception-ы. Swing компоненты, почти все, не расчитаны на многопоточность.
Поэтому обновлять UI, нужно оборачивая код в SwingUtilities.invokeLater или SwingUtilities.invokeAndWait.
В SwingWorker уже используются вышеуказаные методы.

Это всё новичку сходу понять не просто. Надо разбираться.
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #38435676
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Постарайтесь писать поменьше вопросительных и восклицательных знаков и сконцентрировать на более внятной формулировке вопросов. Потому что понятно что вам ничего не понятно, то что конкретно не понятно - не понятно.
1) Методы setText() нельзя вызывать в фоновом потоке.
2) Если while(true)(Random.next();) сделать не фоновом потоке, а в EDT, то GUI перестанет работать, так как он работает только в EDT, который на данный момент занят бесконечным циклом.
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #38437789
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и где закрытие resultSet and connection?
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #38437847
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XPetro123HOME_X,
А что с формой собрался делать? Во время запроса? Закрыть?


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

Ну как в нормальных SQL Developeraх
у меня как-то все запрос были по 2-5 сек. Что никак не нервировало пользователя и не заставляло его играться ещё чем-то.
А асинхронные вещи писать не так просто..... для одной головы пользователя.
imho
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #38438967
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123А асинхронные вещи писать не так просто.....


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

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

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

Благодарен за ответ !
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #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
Выполнение запроса в потоке
    #38439009
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

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

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

Т.е. - forward обьявлений (дочь-родитель) в JAVе нет
Верно ли Вас понял ?
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #38439106
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz
передайте HashMap


Типа того - получилось
Некрасива обертка устранилась ..... спасибо
Код: 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.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;
import javax.swing.SwingWorker;
import java.util.HashMap;

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

		public SaveReturn(Connection cnCon,ResultSet rsSet) {
			this.cnCon = cnCon;
			this.rsSet = rsSet;
			}
		}

	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);
			}
		HashMap hmQuery = new HashMap();
		hmQuery.put(1,(new SaveReturn(cnCon,rsSet)));
		publish(hmQuery);
		return null;
		}

	protected void process(List<HashMap> Items) {
		try{
			SaveReturn srSave = (SaveReturn)Items.get(0).get(1);
			this.dtmMain.setDataSource(srSave.rsSet);
			srSave.rsSet.close();
			srSave.cnCon.close();
			} catch(Exception e) {}
		}
	}
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #38439108
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XТ.е. - forward обьявлений (дочь-родитель) в JAVе нет
Верно ли Вас понял ?


так ответ получить бы - есть/нет ?
forward обьявления ?
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #38439131
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНазывается SecondaryLoop.


Приятно - и писано чуть-чуть ! (это хороший признак)

Вопрос такой насколько хорошо здесь реализована синхронизация потоков
можете ответить - пробывали ?
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #38439135
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz оберните все методы setText внутри вашего потока в этот Runnable.


Здесь не понял - утчоните на пример
Мне важен возврат данных, чтобы был синхронизирован

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

И возвратный тип в моем случае тоже не нужен, можно просто опубликовать пустой HashMap
publish(new HashMap());

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

public class JDBCSwingThread extends SwingWorker<Void, HashMap> {
	private String sPath,sUser,sWord;
	private DatabaseTableModel dtmMain;
	private Connection cnCon;
	private ResultSet  rsSet;
	
	public JDBCSwingThread(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 HashMap());
		return null;
		}

	protected void process(List<HashMap> Items) {
		try{
			this.dtmMain.setDataSource(this.rsSet);
			this.rsSet.close();
			this.cnCon.close();
			} catch(Exception e) {}
		}
	}
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #38439441
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XТ.е. - forward обьявлений (дочь-родитель) в JAVе нет
Верно ли Вас понял ?
Понятия не имею что вы под этим имеете ввиду. Как оно в общераспротраненной терминологии называется?
...
Рейтинг: 0 / 0
Выполнение запроса в потоке
    #38440465
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Да так и называеться forward declaration class
Вот пример кода DELPHI
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
type
{ Forward declarations }

  TField = class;
  TObjectField = class;
  TDataLink = class;

Потом идет обьявление БАЗОВОГО класса который ссылаеться на ЭТО тип
Потом идет обьявление ЭТОГО клаcса который ссылаеться на БАЗОВЫЙ тип



Вот такая типа рекурсивность распределения памяти
Ну если не знаете- то вероятно нету....

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


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