|
|
|
OpenSessionInView и ConnectionPool
|
|||
|---|---|---|---|
|
#18+
Всем привет! Посоветуйте с решением или идеями. Есть проект на java 1.6 + hibernate 3.1 + wicket 1.4 + postgresql 8.3. В проекте используется паттерн OpenSessionInView. Все хорошо, удобно, никаких заморочек. Но ровно до того момента, как в проекте возрастает пиковая нагрузка: например 3000 запросов с секунду. В этом случае, много запросов начинают "тупить" на конекшн пуле. При этом известно, что большинство реквестов реально базу не используют, т.к. 95% инфы уже есть в кеше хибернейта. Т.е., по-быстрому, хочется просто в конекшн пуле увеличить число возможных конектов до 1000 :) Но они могут однажды "положить" базу. Сейчас разрешено 100 конектов, но обычно используется одновременно 3-4, и на самой базе нагрузка почти всегда 0. Другой вариант, использовать какой-то "враппер чего-то", который бы давал работать хибернейту в его кешем на чтение, а вот если требуется непосредственно БД, то тогда уже открывать реальный конект к базе и вот их уже максимум будет 100. Сдается мне проблема известная, но может есть какое-то готовое решение? Или идеи как реализовать этот "враппер чего-то"? :) Спасибо заранее! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 12:02:53 |
|
||
|
OpenSessionInView и ConnectionPool
|
|||
|---|---|---|---|
|
#18+
Read-only транзакции используется? Я не вижу причин почему бы не увеличить колличество соединений в пуле. Ну, и Open-Session-In-View, конечно же, одна из причин невысокой производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 12:08:49 |
|
||
|
OpenSessionInView и ConnectionPool
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, что такое "Read-only транзакции"? Работа с базой полноценная: и инсерты, и апдейты, и селекты :) Просто большая для подавляющей части запросов, вся инфа есть либо в кеше хибернейта, либо в кеше самого приложения. Т.е. отвечая самому себе, да, увеличение конектов в пуле не должно привести к катастрофе. Просто выставить им время жизни при бездействии. Чтобы в пике они создавались в пуле, а потом закрывались, если долго не используются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 13:35:17 |
|
||
|
OpenSessionInView и ConnectionPool
|
|||
|---|---|---|---|
|
#18+
steevyBlazkowicz, что такое "Read-only транзакции"? Работа с базой полноценная: и инсерты, и апдейты, и селекты :) Т.е. просмотра каких-то данных не предполагается? Любая бизнес-транзакция меняет состояние в базе? steevyПросто большая для подавляющей части запросов, вся инфа есть либо в кеше хибернейта, либо в кеше самого приложения. Но кеш ведь ничего не гарантирует. Сейчас данные есть, а потом нет. Транзакция ведь всё равно нужна. А транзакцию обеспечивает только JDBC, если не используется отдельный менеджер транзакций. steevyТ.е. отвечая самому себе, да, увеличение конектов в пуле не должно привести к катастрофе. Просто выставить им время жизни при бездействии. Чтобы в пике они создавались в пуле, а потом закрывались, если долго не используются. Просто если использовать Read-Only транзакции, то JDBC драйверу и базе должно быть проще справиться с бОльшим количеством этих самых соединений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 13:41:46 |
|
||
|
OpenSessionInView и ConnectionPool
|
|||
|---|---|---|---|
|
#18+
steevy, Если заменить пул на другой и протестить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 14:20:51 |
|
||
|
OpenSessionInView и ConnectionPool
|
|||
|---|---|---|---|
|
#18+
steevy, Протестируйте более подробно пул. Если реальных нужных к оннектов 4 штуки, то как можно завалить базу выставив МАХ коннектов 1000? Непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 14:29:58 |
|
||
|
OpenSessionInView и ConnectionPool
|
|||
|---|---|---|---|
|
#18+
steevy, Надо бы ещё логи посмотреть, когда именно создаётся connection. Потому что вот я смотрю SessionImpl и там, вроде, везде реализовано так чтобы Connection создавался (брался из пула) в самый последний момент. Посмотрите классы CMTTransaction|JDBCTransaction|JTATransaction Если у вас работает JDBCTransaction, то очевидно, что connection берется из пула уже в начале транзакции. Ведь без этого транзакционность не обеспечить вообще никак. CMTTransaction позволяет вклинится в этот процесс, например, в случае Read-Only транзакции не трогать JDBC Connection, пока он не будет реально нужен. JTATransaction позволяет использовать JTA менеджеры транзакций, которые тоже не будут трогать ваш connection pool в начале транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 14:39:29 |
|
||
|
OpenSessionInView и ConnectionPool
|
|||
|---|---|---|---|
|
#18+
В общем, увеличил число конектов для пробы до 300. Начал следить во время нагрузки. Почти все время были свободные коннекты в пуле, а вот память в пике выделялась так быстро, что GC ее, видимо, не успевал очищать. Поэтому каждые 5 минут вызывался FullGC секунд на 40. Так что не в том месте я искал корень проблемы, буду рыть сам викет. Но все равно спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 19:38:52 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=193&tid=2127919]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 334ms |

| 0 / 0 |
