|
|
|
Swing бесконечный getConnection() :)
|
|||
|---|---|---|---|
|
#18+
Свинг тут в общем-то ни причем, я думаю, но мало ли. Суть вопроса: Есть две примерно таких таблицы, одна с пользователями Users id name Вторая с заявками, ну или с документами Docs id user_id nameDoc коннекчусь к БД через стандартную: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Создаю модель таблицы, где будут отображаться список документов. В одном из столбцов нужно вывести не user_id а его name из таблицы Users Делаю так: Код: 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. В итоге получаю в output'е бесконечный вывод из System.out.println("getConnection: Ok"); ....getConnection: Ok getConnection: Ok getConnection: Ok.... В модели прописано примерно следующее: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 10:16 |
|
||
|
Swing бесконечный getConnection() :)
|
|||
|---|---|---|---|
|
#18+
1) getValueAt вызывается для каждой ячейки. А значит для каждой строки. А значит, если у вас строк у модели много, то и метод вызовется множество раз. А ещё он вызывается множество раз просто чтобы перерисовать таблицу. 2) Способ реализации getDBConnection у вас самый медленный. Подключите Apache Commons DBCP - примеров в инете навалом. И используйте получение соединения через DataSource. 3) В целом архитектура крайне не удачна и не продуманна. Вам нужна промежуточная модель между Swing и базой данных. Туда нужно вычитать данные для отображения, чтобы быстро их читать из TableModel, например. 4) Обращение к SQL базе, это относительно дорогостоящая операция. Если вы будете выполнять все запросы из Event Dispatch Thread, то ваш UI будет предельно тормозным. Из чего вы сделаете ошибочный вывод, что это Swing такой медленный. Работать с БД нужно через параллельные потоки. Для этого в Swing существует SwingWorker. Который в фоновом потоке произведет медленную операцию. А затем вычитанные данные поможет быстро отобразить синхронно в EDT. Иначе UI будет просто замораживаться на каждый SQL запрос. А в вашем случае даже в два раза дольше, так как DriverManager.getConnection тоже очень дорогая операция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 10:37 |
|
||
|
Swing бесконечный getConnection() :)
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, В очередной раз Спасибо :) Буду разбираться. Для понимая процесса прописал в модели следующее: case 2: // return up.getUsersVisibleNameById(request.getUsersId()); System.out.println("show user id"); return ""; и получил в output тот же бесконечный вывод "show user id" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 10:44 |
|
||
|
Swing бесконечный getConnection() :)
|
|||
|---|---|---|---|
|
#18+
Nixic, Thread.dumpStacktrace() поможет понять откуда происходят все вызовы. Повторяю - метод getValue() дергается множество раз на каждую перерисовку таблицы. Для каждой ячейки. Если у вас перерисовка происходит в бесконечном цикле, возможно вы где-то напхали лишних repaint/invalidate/updateUI методов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 10:55 |
|
||
|
Swing бесконечный getConnection() :)
|
|||
|---|---|---|---|
|
#18+
Nixic, Ещё изучите try with resources. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 12:43 |
|
||
|
Swing бесконечный getConnection() :)
|
|||
|---|---|---|---|
|
#18+
Спасибо, занялся этим :) Продолжаю эксперементировать с jTable. Модель у меня экстендит AbstractTableModel. Пробовал поставить DefaultTableModel. результат тот же, а именно: в тот же самый case поставил счетчик, чтобы i++ чтобы видеть сколько раз запросится getValueAt(...) {} в case 2: За 7 минут перевалило за 100 000. Выключил. Убрал все вызовы модели с полей для фильтрации данных, оставил только один вызов в конструкторе JInternalFrame Я не понимаю, зачем она всё время дергает этот метод пока запущена... Пока писал это сообщение, нашел тему, где объясняется это поведение : You are causing the endless loop in the model. You're calling setValueAt() from getValueAt(). Your implementation of setValueAt() triggers fireTableCellUpdated. This triggers getValueAt(). And the loop repeats. и предлагается такой выход: Add some static counter in your class, initialize to 0. Then in one of these methods which you ntoed, increment the counter each time the method is called. Once the counter reaches value of say 20 or 30, then throw a new RuntimeException("TEST") in this method. Но, правильно ли оно? Как-то оно не особо приглядное... А по поводу " try with resources" вот эта статья подойдет для изучения/понимания? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 13:14 |
|
||
|
Swing бесконечный getConnection() :)
|
|||
|---|---|---|---|
|
#18+
перечитал тему, ссылку на которую поставил выше про getValueAt(...) немного не то... там в коде getValueAt() вызывается setValueAt(...), у меня же такого нет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 13:16 |
|
||
|
Swing бесконечный getConnection() :)
|
|||
|---|---|---|---|
|
#18+
Вставь Thread.dumpStack() и будет видно откуда вызывается. Идея, например подсвечивает рекурсии, если причина в них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 13:20 |
|
||
|
Swing бесконечный getConnection() :)
|
|||
|---|---|---|---|
|
#18+
Вставил Thread.dumpStack(); сразу за System.out.println("show user id:" + i++); Вот копипаст между 3 и 4 счетчиками, так скажем... Код: 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. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 13:26 |
|
||
|
Swing бесконечный getConnection() :)
|
|||
|---|---|---|---|
|
#18+
Не-не. Так не интересно. getValueAt вызывается для каждой ячейки. Зачем вы этот факт игнорируете? Интересны вызовы, когда UI уже полностью отрисован и стабилен. А метод почему-то продолжает вызываться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 13:29 |
|
||
|
Swing бесконечный getConnection() :)
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, уфф, я кажется нашел проблему, она в была моем TableCellRenderer, сейчас я его подебажу маленько. Но и так сразу увидел, что getValueAt() в нем вызывается... Убрал с ячеек его и постоянные вызовы прекратились... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 13:37 |
|
||
|
Swing бесконечный getConnection() :)
|
|||
|---|---|---|---|
|
#18+
В моем TableCellRenderer() была строчка: Код: java 1. Закомментил её, все стало нормально... хм... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 13:51 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38948232&tid=2125490]: |
0ms |
get settings: |
4ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
139ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 453ms |

| 0 / 0 |
