|
|
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
Есть некий пул соединений, с которым работа происходит примерно следующим образом: Код: java 1. 2. 3. При этом у соединения можно выставлять всякие разные свойства, например: Код: java 1. 2. 3. А вопрос такой - какого поведения стоит ожидать от пула по умолчанию: 1. Будут ли сохранятся ли эти свойства у соединения, например, если я вдруг в каком то месте кода говорю, что соединение read only, то во всех других нужно заботиться, чтобы явно переключать этот флаг в false? 2. Или при каждом возврате обратно в пул возвращаются в исходные значения, таким образом всегда при получении соединения из пула можно ориентироваться на некие значения по умолчанию и не переживать, что какой то другой код мог их переключить в иное значение? Или все вендоры, кто в лес, кто по дрова, везде по разному, или проверяй свой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2015, 15:34 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
Нормальный пул должен сам ставить подобные состояния в ожидаемые значения. hikaricp, например, когда делаешь close() проверяет как минимум autoCommit, и если он не тот что надо, то ставит его в нужное значение. Остальные свойства - не пробовал, но по идее тоже должен. Если вы попробуете - отпишите сюда о результатах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2015, 15:43 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
Надо, конечно, заглянуть в JDBC спеку, но на сколько я понимаю, там ничего конкретного на эту тему нет. Пулы, не сильно заморачиваются с тем чтобы самостоятельно менять что-то в Connection, так как это может повлиять на состояние данных. Поэтому клиентский код сам заботится об этих атрибутах. Пул разве что дефолтные значения может установить при создании новых соединений. Именно поэтому чтобы ничего не забыть, лучше навернуть какой-нибудь TransactionManager, который в начале транзакции выставит правильные атрибуты соединения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2015, 15:45 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
Если вдруг кому интересно, то для пула из IBM WAS7 экспериментальным путем установил следующее: При получении соединения из пула оно всегда приходит, со значениями Connection.TRANSACTION_READ_COMMITTED и установленным AutoCommit, независимо от того, что с ним делали при предыдущем использовании. О чем он каждый раз честно рапортует в SystemOut: LocalTranCoor W WLTC0033W: Resource %datasourcename% rolled back in cleanup of LocalTransactionContainment. Дополнительно выяснил, что, как минимум для случаев работы с соединением в рамках потока обработки http запроса возврат соединения в пул происходит не в момент conn.close(), а в какой то другой, после завершения обработки запроса. Т.к. в случае если max размер пула установлен в 10, то на 11ой итерации из ds.getConnection/conn.close() все начинает висеть на ожидании соединения. Да и похоже сам вызов conn.close() совсем не обязателен, по окончании обработки http запроса оно само возвращается в пул. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2015, 18:43 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
just_vladimir Код: java 1. 2. 3. было б что интересного. Все 3 трогать не рекомендуется. Автокоммит выключить. Бывают исключения). Но редко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2015, 21:39 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
just_vladimirно всегда приходит, со значениями Connection.TRANSACTION_READ_COMMITTED это default для основных субд just_vladimirи установленным AutoCommit это странно. Т.е. я даже роллбэк не смогу сделать, он сам коммитит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2015, 21:45 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
just_vladimirЕсли вдруг кому интересно, то для пула из IBM WAS7 экспериментальным путем установил следующее: При получении соединения из пула оно всегда приходит, со значениями Connection.TRANSACTION_READ_COMMITTED и установленным AutoCommit, независимо от того, что с ним делали при предыдущем использовании. Ну, нормалек! Наверняка оно еще где-то конфигурируется, и если надо, то можно подкрутить настройки по умолчанию, и будет отдавать то, что вы хотите. just_vladimirДополнительно выяснил, что, как минимум для случаев работы с соединением в рамках потока обработки http запроса возврат соединения в пул происходит не в момент conn.close(), а в какой то другой, после завершения обработки запроса. Т.к. в случае если max размер пула установлен в 10, то на 11ой итерации из ds.getConnection/conn.close() все начинает висеть на ожидании соединения. Да и похоже сам вызов conn.close() совсем не обязателен, по окончании обработки http запроса оно само возвращается в пул. Тут хз. Я не такой большой спец, но выглядит как вопрос, требующий проработки. Если бы у меня такое возникло, то мне казалось бы, что это какое-то странное поведение, и я бы пытался понять, что происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2015, 22:10 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
Petro123just_vladimir Код: java 1. 2. 3. было б что интересного. Все 3 трогать не рекомендуется. Автокоммит выключить. Бывают исключения). Но редко. C учетом того, что readonly ни Oracle не умеет, ни сама WebSphere не поддерживает, то на него можно забить. Уровень изоляции транзакции доступны только TRANSACTION_READ_COMMITTED и TRANSACTION_SERIALIZABLE, остальные не поддерживаются и в итоге действительно остается только автокоммит... Petro123Т.е. я даже роллбэк не смогу сделать, он сам коммитит? Ага, именно так, идея этой штуки в том, что в тривиальных случаях это избавляет от лишнего бойлерплейт кода. В целом согласен, что удобней иметь по умолчанию отключенным, но для новых соединений это явно оговорено в доке: http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html When a connection is created, it is in auto-commit mode. This means that each individual SQL statement is treated as a transaction and is automatically committed right after it is executed. (To be more precise, the default is for a SQL statement to be committed when it is completed, not when it is executed. A statement is completed when all of its result sets and update counts have been retrieved. In almost all cases, however, a statement is completed, and therefore committed, right after it is executed.) chabapokjust_vladimirЕсли вдруг кому интересно, то для пула из IBM WAS7 экспериментальным путем установил следующее: При получении соединения из пула оно всегда приходит, со значениями Connection.TRANSACTION_READ_COMMITTED и установленным AutoCommit, независимо от того, что с ним делали при предыдущем использовании. Ну, нормалек! Наверняка оно еще где-то конфигурируется, и если надо, то можно подкрутить настройки по умолчанию, и будет отдавать то, что вы хотите. Скорее всего да, но где то глубоко, либо через custom properties, но явно не где то на поверхности... chabapokjust_vladimirДополнительно выяснил, что, как минимум для случаев работы с соединением в рамках потока обработки http запроса возврат соединения в пул происходит не в момент conn.close(), а в какой то другой, после завершения обработки запроса. Т.к. в случае если max размер пула установлен в 10, то на 11ой итерации из ds.getConnection/conn.close() все начинает висеть на ожидании соединения. Да и похоже сам вызов conn.close() совсем не обязателен, по окончании обработки http запроса оно само возвращается в пул. Тут хз. Я не такой большой спец, но выглядит как вопрос, требующий проработки. Если бы у меня такое возникло, то мне казалось бы, что это какое-то странное поведение, и я бы пытался понять, что происходит. Имхо, в целом понятно что происходит. Подозреваю, что если открыть новый поток и проделать тоже самое в нем, то там возврат в пул уже будет только по conn.close и сразу же, может даже проверю чуть позже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2015, 11:14 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
just_vladimir, ну а я о чём. Не ломать голову над этими параметрами (низкоуровневыми\системными). - автокоммит сделан для молодых домохозяек и Hello World. Уже на втором приложении это мешает и надо отключать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2015, 12:55 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
Petro123, просто у меня есть очень много read only обращений, причем таких, что вообще пофиг на всевозможные dirty read и т.д. в связи с чем закралась идея, а не попытаться ли мне с экономить на этом деле, но как оказалось все тлен, ни read only, ни read uncommited не поставить, а автокоммит вообще тут как то сбоку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2015, 13:12 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
http://www-01.ibm.com/support/docview.wss?uid=swg21600078 There is no data source custom property for autoCommit. To set this property in WebSphere Application Server, you need to call setAutoCommit on the connection, as shown above. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2015, 13:23 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
just_vladimirв связи с чем закралась идея классика жанра - оптимизация ради оптимизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2015, 13:27 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
just_vladimirпросто у меня есть очень много read only обращенийНу так заберите одно соединение из пула и не возвращайте, ибо нефиг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2015, 17:38 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovjust_vladimirпросто у меня есть очень много read only обращенийНу так заберите одно соединение из пула и не возвращайте, ибо нефиг. Идею не понял, в чем смысл? Как выяснилось это свойство все равно никем не поддерживается... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2015, 19:06 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
Идея в том, что соединение возвращается в пул тогда, когда оно больше не требуется. Если у вас "много запросов ...", то соединение требуется часто или почти всегда. В этой ситуации "забрать и настроить один раз" - оптимальное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2015, 19:33 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, получить/вернуть соединение в пул ничего не стоит, особо не с экономишь на этом. Хотя в общем то у нас создается ThreadLocal переменная с соединением на каждый Request требующий работу с БД, думаю дополнительно тут больше ничего уже не отыграть... Пока самое существенное, что удалось отыграть это изменение FetchSize, если заранее знаем, что предстоит фетчить много записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2015, 20:39 |
|
||
|
Какого поведения обычно стоит ожидать от Connection Pool?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovjust_vladimirпросто у меня есть очень много read only обращенийНу так заберите одно соединение из пула и не возвращайте, ибо нефиг. В общем случае - совет вредный. tcp-коннекшен к базе рвется - и пипец. Например хост с базой перегрузят, или что-то с сетью будет. Годится только когда и база и приложение локально крутится и все бегает через 127.0.0.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2015, 22:37 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=108&tid=2124512]: |
0ms |
get settings: |
11ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 393ms |

| 0 / 0 |
