|
|
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! До определенного момента не задумывался о тонкостях соединений, думал уйду скоро из программирования вообще, но.. Написал часть некоторого приложения на Swing. Blazkowicz очень здорово мне помог в одной из тем с таблице и с общими направлениями в целом :) Возник вопрос о правильности использования DBCP и.. я бы хотел уточнить эту часть замечаний: "2) Способ реализации getDBConnection у вас самый медленный. Подключите Apache Commons DBCP - примеров в инете навалом. И используйте получение соединения через DataSource. 3) В целом архитектура крайне не удачна и не продуманна. Вам нужна промежуточная модель между Swing и базой данных. Туда нужно вычитать данные для отображения, чтобы быстро их читать из TableModel, например. " Начнем с 2) замечания, я скачал нужные библиотеки, прицепил их, нашел пример, переписал под себя и вот что вышло: Код: 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. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. Я не уверен, что правильно использую написанный пул, все вроде бы работает, по крайней мере, когда я в pgAdmin'e запускаю запрос: select * from pg_stat_activity он мне выдает ровно столько соединений, сколько на данный момент запущенно приложений. Ну и плюс 3шт самого pgAdmin'а. Использую я пул примерно вот так: Код: 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. В этом коде, меня смущает, что я 2 раза закрываю Connection: Код: java 1. в запросе в блоке finally и Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. в классе с пулом. В замечании 3) сказано "Вам нужна промежуточная модель между Swing и базой данных. Туда нужно вычитать данные для отображения, чтобы быстро их читать из TableModel, например." Я не совсем понял, что именно за модель, в каком виде должны хранится данные, предполагаю, что в виде массивов и/или коллекций или... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2015, 16:42 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
Nixicвот что вышло: Код: java 1. Большой бесполезный класс из которого нужен только метод создания DataSource. Всё остальное - мусор. Код: 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. Единственный его критический недостаток это проблема с включением в транзакцию. Тут может помочь Spring JDBC. А ещё я бы порекомендовал обратить внимание на QueryDSL и jOOQ. Они примитивны, то возню с JDBC упрощают значительно. Хотя и обладают массой недостатков для больших проектов. Но для небольшого старта я бы использовал. NixicВ замечании 3) сказано "Вам нужна промежуточная модель между Swing и базой данных. Туда нужно вычитать данные для отображения, чтобы быстро их читать из TableModel, например." Я не совсем понял, что именно за модель, в каком виде должны хранится данные, предполагаю, что в виде массивов и/или коллекций или... ? JTable читает данные из вашего наследника AbstractTableModel AbstractTableModel читает данные из List<User> А у вас в прошлом варианте он читал из ResultSet - этот вариант допустим, особенно если у вас огромная таблицы и вы хотите её грузить лениво. Но такое нужно редко. И пользы от такого решения, зачастую меньше чем вреда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2015, 17:02 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
[quot Nixic]До определенного момента не задумывался о тонкостях соединений, думал уйду скоро из программирования вообще, но.. ... Код: sql 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. Ой! Зачем ЭТО? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2015, 17:24 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
нашел пример тут по работе с spring-jdbc Я правильно понимаю, что вся фишка именно в этой части кода примера: Код: 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. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. В частности в том, что не нужно заботиться о коннекте, пуле и очистке PreparedStatement, ResultSet ? И еще, вот в примере же есть код: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Мне бы хотелось от него избавиться, то есть сразу переводить ResultSet в лист с определенным МОИМ типом. Например, у меня уже есть код, пока без spring-jdbc, примерно такой: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. В нем List<Object[]> records, получается красивым, то есть все данные в нем хорошо и правильно лежат. Я тут погуглил, похоже нет способа, чтобы сразу сделать из него List<Users>. Например как-то через instanceof. Я пробовал не получилось. Выходит, что нужно просто перебирать через for исходный лист и создавать новые объекты типа Users, а потом добавлять их к List<Users> ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2015, 11:28 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
NixicВ частности в том, что не нужно заботиться о коннекте, пуле и очистке PreparedStatement, ResultSet ? Да. А ещё удобно включать в транзакцию. NixicМне бы хотелось от него избавиться, то есть сразу переводить ResultSet в лист с определенным МОИМ типом. Я нифига не понял. Маппер не обязательно использовать. Там есть и другие способы читать из ResultSet. NixicНапример, у меня уже есть код, пока без spring-jdbc, примерно такой: Ага. Сразу видно, где просто и понятно, а где каша. Я бы призадумался. NixicВ нем List<Object[]> records, получается красивым, то есть все данные в нем хорошо и правильно лежат. Да с фига ли. NixicЯ тут погуглил, похоже нет способа, чтобы сразу сделать из него List<Users>. Например как-то через instanceof. Я пробовал не получилось. Выходит, что нужно просто перебирать через for исходный лист и создавать новые объекты типа Users, а потом добавлять их к List<Users> ? Я не понимаю откуда такая привязанность к своему коду, если очевидно что он хуже читается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2015, 11:37 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczNixicВ нем List<Object[]> records, получается красивым, то есть все данные в нем хорошо и правильно лежат. Да с фига ли. А, ну так-то да, подебажил, там не совсем ровно всё лежит :) типы со значением есть, а вот к какому полю оно относится... пошел дальше учиться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2015, 11:54 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
меня просто раздражает маленько вот такая конструкция: Код: java 1. 2. 3. 4. 5. 6. 7. особенно, когда полей в таблице под 200 штук. Но на сколько я понял из вашего выше примера: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. метод toUser(rs) можно написать один раз и использовать его, во всех запросах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2015, 11:58 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
Nixicменя просто раздражает маленько вот такая конструкция: Код: java 1. 2. 3. 4. 5. 6. 7. особенно, когда полей в таблице под 200 штук. Это одна из причин появления hibernate и т.п. :) try (PreparedStatement ps = c.prepareStatement("SELECT * FROM users")) { Кстати, за select * надо бить больно, чтобы на всю жизнь запомнить, что порядок полей, случается, меняется. Ладно поменяется int и String и будет exception, а если два похожих по логике поля? Nixicметод toUser(rs) можно написать один раз и использовать его, во всех запросах? Надо строго следить, чтобы список полей совпадал ( * нельзя). Лучше- вынести в константу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2015, 12:01 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
Nixicменя просто раздражает маленько вот такая конструкция: особенно, когда полей в таблице под 200 штук. Для таких раздражительных есть 100500 способов автоматического и полуавтоматического маппинга колонок на свойства. myBatis, QueryDSL, jOOQ, Apache Commons DBUtils и другие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2015, 12:03 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
Alexey TominКстати, за select * надо бить больно, чтобы на всю жизнь запомнить, что порядок полей, случается, меняется. Ладно поменяется int и String и будет exception, а если два похожих по логике поля? С тем же успехом можно отдубасить и за отсутствие WHERE или LIMIT. Если читать из RS по имени - не вижу никаких проблем. А вот если по-индексу, как у автора, то, да. Достаточно просто порядок колонок поменять и приехали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2015, 12:06 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
Про * не задумывался :) Использовал раньше Hibernate и бед особо не знал, кроме ленивой загрузки и прочих "вкусностей". WHERE в запросах есть, лимит пока не использовал, (в хибере отдельно на query ставил, не в запросе) потому что переписал пока лишь 3 сущности и хочется сделать всё правильно с самого начала. А всего таблиц будет около 30 из 80-ти. Спасибо за пинки в нужном направлении :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2015, 12:16 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
NixicА, ну так-то да, подебажил, там не совсем ровно всё лежит :) типы со значением есть, а вот к какому полю оно относится... пошел дальше учиться :) Потеря типизации это всегда плохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2015, 12:20 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
Это опять я :) Два варианта метода, первый выкидывает ошибку при повторном использовании: org.postgresql.util.PSQLException: Этот Sstatement был закрыт. май 07, 2015 5:24:10 PM nix.tables.models.RequestTableModel getValueAt SEVERE: null java.sql.SQLException: Connection org.postgresql.jdbc4.Jdbc4Connection@4964784d is closed. at org.apache.commons.dbcp2.DelegatingConnection.checkOpen(DelegatingConnection.java:605) Код: 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. Я как-то неправильно использую try-with-resources или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2015, 15:26 |
|
||
|
Apache Commons DBCP, Swing покритикуйте код.
|
|||
|---|---|---|---|
|
#18+
Nixic, Потому что ваша реализация DBConnectionPool предельно кривая. Нормальный пул забирает соединения по Connection.close() и останавливает свою работу закрывая все физические соединения по pool.close(); Я уже писал выше, что соединения надо брать из DataSource, а не из своего странного велосипеда с квадратными колесами. Класс DBConnectionPool избыточный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2015, 15:41 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=131&tid=2125448]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 259ms |
| total: | 361ms |

| 0 / 0 |
