|
|
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
Здравствуйте ! Подскажите пожалуйста: сессия хибера = сессия Oracle ? Не нашел внятного обьяснения в инете. Или ткните кто нибудь носом. Почему возник вопрос : я делаю запросы к Oracle опираясь на выставленные, в этой же сессии хибера, параметры в сессии Oracle. Я понимаю, что сессии хибера возвращаются в пул. Каждый раз при получении сессии : .... sessionFactory = new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory(); ..... if (session == null) { session = sessionFactory.openSession(); <выполнение инициализации параметров на стороне Oracle> ....... Я инициирую параметры в сессии Oracle. Опасения по сути только в одном : могут ли несколько клиентов моего Web сервера(Tomcat), использовать один и тот же экземпляр session Hibernate ? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 16:12:40 |
|
||
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
vlad_nal, - нет. Сессия хибера это Open и Close рессурса (напр. хэндла файла). Т.е. чисто внутреннее дело хибера. - если пул, то это значит Обезличенные\публичные пользователи или Веб-проект. Код: java 1. 2. 3. 4. 5. 6. т.е. а=b в ООП на сервере, так же как и в БД это одинковые строки. у хибера transaction-scoped identity, условие идентичности гарантируется в рамках транзакции (имеется ввиду не database transaction). Т.е. сессию оракла не рекомендуется трогать, т.к. 1) пул и 2) транзакции - короткие. Но это веб-подход. Есть разные проекты. Т.е. обычно Бизнес транзакция = сессии хибера или равна времени реквеста (ответа) HTTP сервера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 16:58:16 |
|
||
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
не понял ответ. про то что сессия хибера не равна сессии БД, понял. Сессия хибера конечно может быть связанна и с чтением из линейного файла. больше волнует вопрос: я получил сессию хибера связанную с коннектом к БД. этот же экземпляр сессии, параллельно, может использоваться несколькими web пользователями ? я вот не представляю как можно через один коннект к БД делать параллельно несколько запросов сразу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 17:26:32 |
|
||
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
vlad_nalне понял ответ. про то что сессия хибера не равна сессии БД, понял. Сессия хибера конечно может быть связанна и с чтением из линейного файла. ===== это был просто аналог из другой области...о том что СессХибера надо открывать и закрывать. больше волнует вопрос: я получил сессию хибера связанную с коннектом к БД. этот же экземпляр сессии, параллельно, может использоваться несколькими web пользователями ? ==== 1) Хто такой веб пользователь? Не может, т.к. разные пользователи запускают РАЗНЫЕ ЗАПРОСЫ В РАЗНЫХ ТРАНЗАКЦИЯХ \ Осликах. И это правильно. я вот не представляю как можно через один коннект к БД делать параллельно несколько запросов сразу. ========= изучи как работает простой пул на 2 коннекта для 100 пользователей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 17:42:15 |
|
||
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
vlad_nalя вот не представляю как можно через один коннект к БД делать параллельно несколько запросов сразу. Никак. JDBC этого не позволяет. Поэтому на каждый параллельный запрос по отдельному конекшну. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 17:43:00 |
|
||
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
Я так понимаю, что пул на 2 конекта для 100 пользователей будет работать только тогда когда я сессию возвращаю в пул. Веб пользователь = сессия web сервера, при jsf, это обьекты имеющие : @SessionScoped Подскажите, если я не закрываю сессию явно , то есть никаких session.close не делаю, когда происходит возврат сессии в пул ? И происходит ли вообще? Вот сейчас по логам своего приложения(но правда в одно пользовательском режиме) и вижу, что я один раз получил обьект session хибера и так с ним и работаю. Это значит что если у меня зайдут 150 пользователей у меня будет 150 коннектов к БД ? А если в настройках хибера стоит ограничение пула в 50 коннектов ? остальные обломяться ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 17:57:47 |
|
||
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
Petro123, ========= изучи как работает простой пул на 2 коннекта для 100 пользователей. Я бы с удовольствием. А как это сделать ? Юнит тесты написать ? просто как сэмулить 100 пользователей ? или где то есть уже описание как все работает ? киньте ссылку пожалуйста! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 18:01:26 |
|
||
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
vlad_nalPetro123, ========= изучи как работает простой пул на 2 коннекта для 100 пользователей. Я бы с удовольствием. А как это сделать ? Юнит тесты написать ? просто как сэмулить 100 пользователей ? или где то есть уже описание как все работает ? киньте ссылку пожалуйста! 1. Я JSF не знаю, возможно там специфика и РУками ничего делать не надо. 2. Ты полез в сессию Оракла. Зачем? 3. Нужно взять демки по JSF и ответить - что не получилось. "не ищи там где светло (сессии), а ищи что потерял (нагрузочное тестирование хоть на 2 пользователя)". авторВот сейчас по логам своего приложения(но правда в одно пользовательском режиме) и вижу, что я один раз получил обьект session хибера и так с ним и работаю. сделай 2-х в двух Ослах или 2-х девайсах. IMHO ЗЫ в пуле все ждут, когда будет освободившийся коннект от другого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 18:09:39 |
|
||
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
vlad_nal, WAPT - нагрузочное тестирование сайта виртуальными пользюками http://www.loadtesting.ru/product.shtml ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 18:16:43 |
|
||
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
vlad_nalЯ так понимаю, что пул на 2 конекта для 100 пользователей будет работать только тогда когда я сессию возвращаю в пул. Веб пользователь = сессия web сервера, при jsf, это обьекты имеющие : @SessionScoped Подскажите, если я не закрываю сессию явно , то есть никаких session.close не делаю, когда происходит возврат сессии в пул ? И происходит ли вообще? Вот сейчас по логам своего приложения(но правда в одно пользовательском режиме) и вижу, что я один раз получил обьект session хибера и так с ним и работаю. Это значит что если у меня зайдут 150 пользователей у меня будет 150 коннектов к БД ? А если в настройках хибера стоит ограничение пула в 50 коннектов ? остальные обломяться ? Что-то у вас всё в кашу намешалось. Oracle сессия живет внутри физического JDBC Connection. Есть разные способы и фичи оракла, но в web приложениях, чаще всего сессия в базе данных не используется. Благодаря этому разные пользователи могут использовать один и тот же Connection по-очереди. А чтобы пользователи могли работать параллельно, используется JDBC Connection Pool. (Это лишь самый распространенный вариант, приложения могут диктовать свою специфику). Жизненый цикл использования Connection обычно совпадает с транзакцией. Так как, чаще всего, транзакция сервера просто использует механизм транзакций БД. Hibernate Session это Unit Of Work. Обычно она никак не шарится между пользователями, а создаётся новая на каждую транзакцию. Hibernate Session кеширует в себе даннные и изменения касающиеся текущей транзакции. Возможны варианты, но для начала лучше просто принять это за данность. Для Hibernate Session никакие пулы не применяются. SessionScoped это вообще привязка к HTTP Session сервера. Ни с Hibernate Session ни с JDBC Connection её лучше не связывать. Не то чтобы это не возможно. Просто нужно понимать все последствия такой архитектуры. JDBC Pool лучше настроить на сервере приложений, а не в хибернейте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 18:16:52 |
|
||
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
Petro123, спасибо, попробую потестить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 19:07:13 |
|
||
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Тогда чтоб до конца понять: Oracle сессия живет внутри физического JDBC Connection. Есть разные способы и фичи оракла, но в web приложениях, чаще всего сессия в базе данных не используется. Благодаря этому разные пользователи могут использовать один и тот же Connection по-очереди. А чтобы пользователи могли работать параллельно, используется JDBC Connection Pool. - Я правильно понимаю что делая: session = sessionFactory.openSession(); я не получаю коннект к БД(JDBC Connection)? тогда когда собственно обьект session в jsf получает JDBC Connection ? Hibernate Session это Unit Of Work. Обычно она никак не шарится между пользователями, а создаётся новая на каждую транзакцию. Hibernate Session кеширует в себе даннные и изменения касающиеся текущей транзакции. Возможны варианты, но для начала лучше просто принять это за данность. Для Hibernate Session никакие пулы не применяются. - А что же тогда такое sessionFactory как не аналог пула? SessionScoped это вообще привязка к HTTP Session сервера. Ни с Hibernate Session ни с JDBC Connection её лучше не связывать. -это понятно, я просто ассоциирую Web пользователя с HTTP Session. JDBC Pool лучше настроить на сервере приложений, а не в хибернейте. - что подразумевается под "сервером приложений" ? Томкат ? у меня Apach+TomCat В связи со всем вышесказанным главный вопрос : как Hibernate Session соотноситься с JDBC Connection ? я же явно не управляю JDBC Connection, не получаю его , я работаю с Hibernate Session. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 19:25:09 |
|
||
|
JSF + Hibernate + Oracle
|
|||
|---|---|---|---|
|
#18+
vlad_nal- Я правильно понимаю что делая: session = sessionFactory.openSession(); я не получаю коннект к БД(JDBC Connection)? Скорее всего правильно. Надо исходники посмотреть. Hibernate возьмет JDBC Connection для этой сессии тогда когда он ему понадобится. Дока говорит тоже самое: RTFMOpen a Session, utilizing the specified Interceptor. JDBC connection(s will be obtained from the configured org.hibernate.connection.ConnectionProvider as needed to perform requested work. vlad_nalтогда когда собственно обьект session в jsf получает JDBC Connection ? JSF это фреймверк представления. Он никакого отношения к Hibernate/JDBC не имеет. JEE спека для Hibernate называется JPA. Но у вас она, кажется, не используется. Что за "обьект session в jsf" - я не знаю. Hibernate возмет Connection из своего ConnectionProvider, о чем в доке и сказано. А тот в свою очередь может использовать свой пул, или JNDI DataSource, смотря как настроить. Последнее предпочтительнее. vlad_nal- А что же тогда такое sessionFactory как не аналог пула? Это совершенно не аналог пула. Во-первых он не пулирует сессии, а всегда создаёт новые. Во-вторых это контейнер для настрок Hibernate, который в зависимости от этих настроек и создаёт Session. vlad_nal-это понятно, я просто ассоциирую Web пользователя с HTTP Session. Это понятно. Просто оно к Hibernate/JDBC отношения почти не имеет. Рекомендую сначала разобраться с чем-то одним. vlad_nal- что подразумевается под "сервером приложений" ? Томкат ? у меня Apach+TomCat http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html vlad_nalВ связи со всем вышесказанным главный вопрос : как Hibernate Session соотноситься с JDBC Connection ? я же явно не управляю JDBC Connection, не получаю его , я работаю с Hibernate Session. В общем случае, Hibernate Session держит ссылку на JDBC Connection, пока не будет закрыта сессия. session.close() приводит к connection.close(). Что в свою очередь возвращает соединение в пул, если пул используется. Либо закрывает соединение, если пул не используется. Откройте SessionImpl.java и посмотрите реализацию метода close(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 19:45:28 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38309782&tid=2129111]: |
0ms |
get settings: |
16ms |
get forum list: |
22ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
49ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
73ms |
get tp. blocked users: |
2ms |
| others: | 270ms |
| total: | 463ms |

| 0 / 0 |
