|
|
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
Есть кучка (17-15) "одиночных" экземпляров Singleton классов, которые делают запросы( select, update) из оракла, и на основе некоторых запросов, уже порождают конкретные экземпляры других классов ( как пользовательские типы или структуры в c#). Рационально ли использовать синглтон вообще ( в плане производительности), когда клиентов на одну страницу jsp может быть до 5-ти тысяч одновременно? В данном коде как я понял нет никакой реализации того что к единому экземпляру обратились 5-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. 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. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. PS Мопед не мой, я просто разместил объяву (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 10:08 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
anykey33PS Мопед не мой, я просто разместил объяву (с) Лень читать сей говнокод. 1. Использовать пул коннектов. 2. На каждый запрос- получить коннект из пула, сделать preparedStatement запрос, заполнить параметрами, выполнить, закомитить, закрыть запрос, вернуть коннект в пул. Тогда всё будет хорошо, и будит управляться размером пула. PS: почему preparedStatement даже если запрос каждый раз создаётся- объяснять надо? Минимум две причины, и обе серьёзные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 10:14 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
anykey33 Код: java 1. 2. 3. 4. 5. PS Мопед не мой, я просто разместил объяву (с) Твой, не твой- но вываливать выхлоп декомпилятора в конференцию- это неприлично... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 10:17 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
Alexey TominТвой, не твой- но вываливать выхлоп декомпилятора в конференцию- это неприлично... Сорри, но preparedStatement есть в гавнокоде. У меня вопрос как у новичка в принципе, синглтон нормален как паттерн в данном случае или нет, абстрагировано без относительно к пулу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 10:28 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
anykey33, ну нет такого слова "абстрактно нормален" )))) Как у жванецкого)) Даже если будет очередь, то потоки создаст контейнер. Тебе легче от этого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 10:44 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
anykey33, судя по коду 1) это не синглтон. Поксольку jsp и 5 тысяч клиентов, а метод getFactory() ничем не защищен, вероятно создание нескольких экземпляров CompTivBeanFactory из разных потоков 2) в конкретном примере можно обойтись статическими методами, а значит, синглтон тут - лишняя абстракция. Если совсем крохоборствовать, ухудшающая производительность (getFactory() и лишнее обращение к стеку :)). 3) Возможно, причины создания синглтона есть в предке (DataBaseHelper), но тут этого не видно. Интересно было бы посмотреть что происходит в методе this.getConnection(), могут быть сюрпризы в многопоточной среде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 11:25 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
anykey33Alexey TominТвой, не твой- но вываливать выхлоп декомпилятора в конференцию- это неприлично... Сорри, но preparedStatement есть в гавнокоде. Я ж говорю- не читал особо код :D anykey33У меня вопрос как у новичка в принципе, синглтон нормален как паттерн в данном случае или нет, абстрагировано без относительно к пулу? Вообще если у класса нет состояния- то он может быть синглтоном. У DAO "состояние"- это пул коннектов- а он один. Так что DAO может быть синглтоном. Вот если пула нет, то возникает вопрос- коннект что, один? Если да- то синглтон будет очень плохо- коннект внутри синхронизирован и все запросы выстроятся в очередь. Если коннект создаётся каждый раз (что уже безумие), то у класса вообще нет состояния и без разницы. Но если класс не синглтон и коннект у каждого свой- то их количество будет расти бесконтрольно, что может привести к проблемам со стороны как сервера БД, так и тамошних админов (поэтому надо сначала прикинуть, кто кого побить сможет при выяснении отношений) :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 11:44 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
ivanraanykey33, судя по коду 1) это не синглтон. Поксольку jsp и 5 тысяч клиентов, а метод getFactory() ничем не защищен, вероятно создание нескольких экземпляров CompTivBeanFactory из разных потоков 2) в конкретном примере можно обойтись статическими методами, а значит, синглтон тут - лишняя абстракция. Если совсем крохоборствовать, ухудшающая производительность (getFactory() и лишнее обращение к стеку :)). 3) Возможно, причины создания синглтона есть в предке (DataBaseHelper), но тут этого не видно. Интересно было бы посмотреть что происходит в методе this.getConnection(), могут быть сюрпризы в многопоточной среде А разве не защищает getFactory() этот код? Вроде как он один на всех, я дебаг лог смотрел на тестовом сервере, конструкторы пишутся только при первом подключении, один раз и до перегрузки сервера, они не создаются судя по логу. Код: java 1. 2. 3. 4. 5. 6. 7. Вот DataBaseHelper, приложение крутится на вебсфере может оно конечно пулами рулит. Код: 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. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 12:03 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
[quot anykey33] А разве не защищает getFactory() этот код? Вроде как он один на всех, я дебаг лог смотрел на тестовом сервере, конструкторы пишутся только при первом подключении, один раз и до перегрузки сервера, они не создаются судя по логу. Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 12:21 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
Alexey TominНо если класс не синглтон и коннект у каждого свой- то их количество будет расти бесконтрольно, что может привести к проблемам со стороны как сервера БД, так и тамошних админов (поэтому надо сначала прикинуть, кто кого побить сможет при выяснении отношений) :) для корпоратива - потянет (коннект на начало сессии). Для обезличенного анонимного веб юзверя - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 12:40 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
anykey33 Рационально ли использовать синглтон вообще ( в плане производительности), когда клиентов на одну страницу jsp может быть до 5-ти тысяч одновременно? Давайте пойдем от обратного и вы распишете почему по-вашему это может быть не рационально? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 12:46 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
Blazkowiczanykey33 Рационально ли использовать синглтон вообще ( в плане производительности), когда клиентов на одну страницу jsp может быть до 5-ти тысяч одновременно? Давайте пойдем от обратного и вы распишете почему по-вашему это может быть не рационально? Мое воображение рисовало, длинную очередь к единому для всех методу в котором нужно выполнить запрос, но сейчас склоняюсь к тому, что куча запросов от вебсервера к базе данных будет еще хуже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 12:57 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
anykey33 Мое воображение рисовало, длинную очередь к единому для всех методу в котором нужно выполнить запрос, но сейчас склоняюсь к тому, что куча запросов от вебсервера к базе данных будет еще хуже. Вашему воображению пора начать изучать параллельное программирование. https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html Очереди выстраиваются только за блокировками. В работе с БД из Java очередь может возникнуть только если synchronized/Lock используется в Java коде. Пул соединений слишком мал и часто блокируется, так как все соединения используются. Происходит много апдейтов и БД приходится синхронизировать транзакции блокируя отдельные участки данных. Другая проблема это безопасная инициализация синглтона при высокой нагрузке именно в момент инициализации. Но для неё есть простое решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 13:18 |
|
||
|
Singleton при большой нагрузке.
|
|||
|---|---|---|---|
|
#18+
anykey33 Вот DataBaseHelper, приложение крутится на вебсфере может оно конечно пулами рулит. Тут следует бояться не проблем с производительностью. Код не готов к работе с множеством потоков. Что можно сделать по-быстрому - сделать синглтон в DataBaseHelper - в самом DataBaseHelper всю инициализацию перенести в статический инициализатор класса (неленивый синглтон), тем временем изучать параллельное программирование, чтобы потом написать настоящий ленивый синглтон - отказаться от наследования от DataBaseHelper, максимум - использовать композицию. DataBaseHelper и фабрики бинов выполняют совершенно разные задачи - сами фабрики бинов в синглтонах не нуждаются, это паттерн ради паттерна, по крайней мере в приведенном классе CompTivBeanFactory. Изучать паттерны, для чего они нужны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2015, 13:31 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=59&tid=2125129]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
174ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 252ms |
| total: | 540ms |

| 0 / 0 |
