|
|
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
Доброго дня господа ! Хочу выполнить запрос в потоке (чтобы не дуплить форму) Элемент вызова - 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. Это код потока Код: 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. Это ошибка Произошла ошибка в визуализации: java.lang.NullPointerExceptionВероятно необходимо правильно синхронизировать потоки и отклонировать ResultSet (так как поток закончиться и соединение с базой закроеться) Подскажите как правильно реализовать задачу. Заранее благодарен ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2013, 15:59:22 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
HOME_X, А что с формой собрался делать? Во время запроса? Закрыть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2013, 21:31:52 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
Petro123HOME_X, А что с формой собрался делать? Во время запроса? Закрыть? Форма открыта - можно передвигать окно, чего-то там досматривать, кнопка выполнения блокирована (пока работает запрос) Ну как в нормальных SQL Developeraх ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 00:20:58 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
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 - обьект главного потока Chuck - счетчик допол. потока У меня другая ситуация - необходимо вернуть ResultSet - как его заполнить для главного обьекта - присвоение его типа DatabaseTableModel Не могли бы показать как это реализовать на моем коде P.S. - попутный вопрос (из статьи) Код: javascript 1. 2. Здесь же должно быть приведени типов ? уточните синтаксис пожалуйста for (Integer chunk : chunks) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 00:59:58 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
HOME_X, В окончательном варианте имею Следующий вызов Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Следующий поток Код: 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. Оцените верно ли решение ? Заранее благодарен ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 03:51:18 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
HOME_XТему исследовал, насколько понял это тот же обьект только с некоторой интерпритацией для пользователей Ну, раз исследовал, то вот это, наверное тоже понимаешь http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 10:01:07 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
HOME_XОцените верно ли решение ? Нет. - Переменные не принято называть с заглавной буквы. - Это не нужно делать каждый раз - Class.forName("oracle.jdbc.driver.OracleDriver"); - Это отнимает достаточно много времени - DriverManager.getConnection(Path,User,Word); - Это будет приводить к случайным и необхяснимым ошибкам this.dtmMain.setDataSource(...) - Statement не закрывается, Connection закрывается почему-то не в блоке finally. Когда закрывается ResultSet - не понятно вообще. Всё это приведет к утечкам памяти. - new Thread().start() хоть и не значительно, но медленнее чем запуск через ThreadPoolExecutor ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 10:47:29 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
BlazkowiczHOME_XОцените верно ли решение ? - Это не нужно делать каждый раз - Class.forName("oracle.jdbc.driver.OracleDriver"); тоже полезно для чтения http://www.javaworld.com/javaqa/2003-06/01-qa-0606-load.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 10:59:28 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
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. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 14:40:27 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
такой такой код читать сил нет, всё равчно что эпилептические картинки смотреть. по поводу синхронизации - всё просто. Есть один единственный поток EDT, в котором работает Swing. Когда вы читаете данные в другом потоке, вам надо их как-то передать обратно в Swing UI (обновить view). Но, если вы это сделатете в другом потоке, могут возникать случайные exception-ы. Swing компоненты, почти все, не расчитаны на многопоточность. Поэтому обновлять UI, нужно оборачивая код в SwingUtilities.invokeLater или SwingUtilities.invokeAndWait. В SwingWorker уже используются вышеуказаные методы. Это всё новичку сходу понять не просто. Надо разбираться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 14:54:58 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 15:01:44 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВ SwingWorker уже используются вышеуказаные методы. Поетому Вы и предложили мне этот класс SwingWorker Понято - принято - спасибо ! ЦЕННО ! На каком этапе присходит такая синхронизация ? Исходя из листинга - могу предположить - publish(new FlipPair(heads, total)); Но не совсем понимаю !!!! Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 15:09:24 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
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 ???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 15:16:36 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
HOME_XИсходя из листинга - могу предположить - publish(new FlipPair(heads, total)); Пардон !!! Наверное внутри класса, это более логично ! protected void process(List<FlipPair> pairs) Но зачем еще класса и доп метод ? FlipPair(long heads, long total) Код: java 1. Почему нельзя считать Random прамо в protected void process ???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 15:18:46 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
Постарайтесь писать поменьше вопросительных и восклицательных знаков и сконцентрировать на более внятной формулировке вопросов. Потому что понятно что вам ничего не понятно, то что конкретно не понятно - не понятно. 1) Методы setText() нельзя вызывать в фоновом потоке. 2) Если while(true)(Random.next();) сделать не фоновом потоке, а в EDT, то GUI перестанет работать, так как он работает только в EDT, который на данный момент занят бесконечным циклом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 15:22:04 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
Blazkowicz. 1) Методы setText() нельзя вызывать в фоновом потоке. 2) Если while(true)(Random.next();) сделать не фоновом потоке, а в EDT, то GUI перестанет работать, так как он работает только в EDT, который на данный момент занят бесконечным циклом. Т.к. - синхронизацией занимаеться именно "void process" Принято - осознано ! А обособленный класс FlipPair - реализован для синхронизации ДВУХ и больше переменных в одной записи (итерации цикла) так как идет публикация и фиксация двух значений(выбираем последнее значение в семействе) Код: java 1. 2. В ином случае значение переменные total;heads могли бы быть из разных итераций цикла. Верно ли Вас понял ? Blazkowicz - Это будет приводить к случайным и необхяснимым ошибкам this.dtmMain.setDataSource(...) Вопрос закрыт переделаю под класс SwingWorker Blazkowicz - Это отнимает достаточно много времени - DriverManager.getConnection(Path,User,Word); Не понял - мне не надо держать канал открытым - сделал запрос - вернул данные - закрыл канал Как Вы видите более оптимально ? Blazkowicz. понятно что вам ничего не понятно Вы абсолютно верно заметили Мне действительно далеко не все понятно (синтаксис в том числе) - спасибо за пояснение ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 17:15:48 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
Уважаемый Blazkowicz ! Попытался изобразить свой класс на основании Вашего примера Вроде работает - досмотрите пожалуйста верно ли понял суть Код: java 1. Код: 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. Заранее благодарен ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 01:27:55 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
ну и где закрытие resultSet and connection? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 02:31:55 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
HOME_XPetro123HOME_X, А что с формой собрался делать? Во время запроса? Закрыть? Форма открыта - можно передвигать окно, чего-то там досматривать, кнопка выполнения блокирована (пока работает запрос) Ну как в нормальных SQL Developeraх у меня как-то все запрос были по 2-5 сек. Что никак не нервировало пользователя и не заставляло его играться ещё чем-то. А асинхронные вещи писать не так просто..... для одной головы пользователя. imho ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 09:15:48 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
забыл никну и где закрытие 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); а после закрыть канал, следовательно делаю так. Если неверно думаю, исправьте - буду признателен за помощь ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 19:57:11 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
Petro123А асинхронные вещи писать не так просто..... Согласен с Вами - геморой ! "Прямой" код намного приятен в отладке и надежен А если запрос достаточно длителен - тогда как ? Все равно без потоков все равно никуда не деться, цель понял как делать и какие инструментами Благодарен за ответ ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 20:01:44 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
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. Заранее благодарен ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 20:12:51 |
|
||
|
Выполнение запроса в потоке
|
|||
|---|---|---|---|
|
#18+
HOME_X, В чем проблема завернуть несколько значений объединенных одним признаком в класс. Ну, передайте HashMap, если такая проблема класс создать. Кстати, я вспомнил про способ сделать тоже самое без SwingWorker. Он появился в Java 7. Называется SecondaryLoop. Код можно сделать немного проще чем со SwingWorker, но всё равно как-то нужно передать значения из JDBC потока... Хотя и это можно обойти через SwingUtilities.invokeLater(Runnable) - оберните все методы setText внутри вашего потока в этот Runnable. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 20:40:44 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38435086&tid=2128346]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
181ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 256ms |
| total: | 544ms |

| 0 / 0 |
