Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранение Connection в сессии, Где можно хранить Connection к БД? 
:(
    Опции темы
5ad1sT
Дата 25.9.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 10.2.2009

Репутация: нет
Всего: нет



Есть приложение работающее с БД Oracle через пул коннектов. Для доступа к бд используется Hibernate + spring. Все отлично, но вот есть одна проблемка. Иногда требуется подключаться к БД и выполнять запросы на прямую, без Hibernate. 
Собственно пример получения коннекта:
Код

class SomeClassDAO extends HibernateDaoSupport {
     ....
     public List getModels (...) {
             Connection conn = getSession().getConnection();
             ....
     }
     ....
}

Все красиво работает, соответственно в конце метода коннект закрывается. Но, поскольку таблицы из которых выбираются данные, огромных размеров, то создаются временные (TEMP) и потом из них идет уже выборка. Эти таблицы создаются вначале этого метода. Проблема состоит в том, что этот метод вызывается несколько десятков раз подряд, тоесть он выдает информацию порциями и каждый раз создаются TEMP таблицы... это грузит БД, но работает smile
Был предпринят шаг к оптимизации. TEMP таблицы создавались один раз, перед выборкой данных порциями. В результате выборка работала через раз... т.к. терялась сессия с Ораклом и для данной сессии в таблицах уже небыло нужной информации.

Есть предложение хранить Коннекшн отдельно, в сессии, или еще где посоветуете, но вот как это лучше реализовать? и есть ли вообще выход из этой ситуации?

Заранее спасибо.
PM MAIL   Вверх
DimW
Дата 25.9.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 3
Всего: 44



Цитата(5ad1sT @  25.9.2009,  12:22 Найти цитируемый пост)
т.к. терялась сессия с Ораклом

выяснили почему?

Цитата(5ad1sT @  25.9.2009,  12:22 Найти цитируемый пост)
Но, поскольку таблицы из которых выбираются данные, огромных размеров, то создаются временные (TEMP) и потом из них идет уже выборка.


вы знакомы с материализованными представлениями?
если да, то почему их не используете?

Добавлено через 6 минут и 11 секунд
а коннекшен нужно хранить я так понимаю для того,  что бы данные в во временных таблицах не терялились?

Добавлено через 7 минут и 30 секунд
Цитата(DimW @  25.9.2009,  13:41 Найти цитируемый пост)
выяснили почему?

на этот вопрос не отвечайте - почему, я уже понял.
PM MAIL ICQ   Вверх
5ad1sT
Дата 25.9.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 10.2.2009

Репутация: нет
Всего: нет



Цитата(DimW @ 25.9.2009,  13:41)
Цитата(5ad1sT @  25.9.2009,  12:22 Найти цитируемый пост)
т.к. терялась сессия с Ораклом

выяснили почему?

Цитата(5ad1sT @  25.9.2009,  12:22 Найти цитируемый пост)
Но, поскольку таблицы из которых выбираются данные, огромных размеров, то создаются временные (TEMP) и потом из них идет уже выборка.


вы знакомы с материализованными представлениями?
если да, то почему их не используете?

Сессия теряется скорее всего из-за того что в каждой порции мы получаем коннекшн, а потом его закрываем, соответственно он улетает в пул.. а в следующий раз у нас уже может быть другой коннекшн и соответственно уже и сессия с ораклом другая... 

На счет материализованных представлений, материализованное представление
То я не думаю что это на подойдет. Данные во временных таблицах должны быть в исходном виде, а не сводные и т.п. Это делается для того чтобы не проходить по нескольким миллионам записей, а из много меньшего количества записей выбирать.

Я думаю просто как вариант для всех порций вначале получить один коннекшн, не закрывая его, выбирать данные, а в конце закрыть. Но вот где его хранить ? 
PM MAIL   Вверх
DimW
Дата 25.9.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 3
Всего: 44



Цитата(5ad1sT @  25.9.2009,  12:22 Найти цитируемый пост)
перед выборкой данных порциями

приведите пример выборки данных порцией.

Цитата(5ad1sT @  25.9.2009,  13:50 Найти цитируемый пост)
Это делается для того чтобы не проходить по нескольким миллионам записей

интересно как вы формируете меньший набор данных не проходя многомиллионный?

Цитата(5ad1sT @  25.9.2009,  13:50 Найти цитируемый пост)
Я думаю просто как вариант для всех порций вначале получить один коннекшн, не закрывая его, выбирать данные, а в конце закрыть. Но вот где его хранить ?

если при получении вы используете одну http сессию, то в ней и храните, только вот проблемы ваши не сводятся к хранению коннекта...

Добавлено через 4 минуты и 12 секунд
Цитата(5ad1sT @  25.9.2009,  13:50 Найти цитируемый пост)
На счет материализованных представлений, материализованное представление

не стоит черпать знания по трем строчкам из wiki, это лишь малая часть вершины айсберга.
PM MAIL ICQ   Вверх
5ad1sT
Дата 25.9.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 10.2.2009

Репутация: нет
Всего: нет



Суть порций в том что из временной таблицы выбираются данные регулируясь rownum'ами, тоесть к примеру, сначала первые 100, потом следующие 100 и т.д.
После выборки порции, данные обрабатываются и выдаются в поток в виде xml.

Я не говорил что мы не проходим по большой таблице, просто мы по ней проходим один раз smile потом все действия производятся с временной таблицей.

На счет материализованных представлений, то тут не так все просто. Я с ними пока знаком очень поверхностно. Но, уже могу сказать что они нам скорее всего не очень помогут, возможно я ошибаюсь... 

Еще вопросик знающим (пока-что сам не дошел до этого):
Могут ли МП быть созданы для n количества запросов одновременно? Тоесть несколько запросов с разным промежутком времени (прим: за вчера и за прошлый год). 


PM MAIL   Вверх
DimW
Дата 25.9.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 3
Всего: 44



Цитата(5ad1sT @  25.9.2009,  15:13 Найти цитируемый пост)
Я не говорил что мы не проходим по большой таблице, просто мы по ней проходим один раз  потом все действия производятся с временной таблицей.

вот этот момент не мешало бы уточнить. 
1) вы перекладываете данные из одной таблицы в другую(во временную), а потом эти же данные режите и формируете по ним XML?
2)во временную таблицу помещаются данные сводные из нескольких таблиц?

Цитата(5ad1sT @  25.9.2009,  15:13 Найти цитируемый пост)
возможно я ошибаюсь... 

возможно я тоже, но для этого нужно понять как вы формируете итоговый набор, и какую цель вы приследовали перекладывая его во временную таблицу.

Цитата(5ad1sT @  25.9.2009,  15:13 Найти цитируемый пост)
Могут ли МП быть созданы для n количества запросов одновременно? Тоесть несколько запросов с разным промежутком времени 

если количество выводимых полей и их типы совподают то выглядеть это должно примерно так:
Код

select field1, field2, field3
  from table t
 where trunc(t.field_date)  = trunc(sysdate) - 1 -- за вчера
union all
select field1, field2, field3
  from table2 t2
 where trunc(t2.field_date)  between trunc(trunc(sysdate, 'year') - 1, 'year') and trunc(sysdate, 'year') - 1 -- за прошлый год


вслучае если данные за разные периоды беруться из одной таблицы, то ни что не мешает их получать одним запросом используя OR.
PM MAIL ICQ   Вверх
5ad1sT
Дата 25.9.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 10.2.2009

Репутация: нет
Всего: нет



Во временной таблице данные из одной таблицы. Но, в самом запросе используется еще дополнительно пара таблиц связанных между собой.
Запрос сейчас строится примерно так:
Код

select m.USERID, m..., m..., (select sum(t.someField) from TEMP_TABLE t where t.USERID = m.USERID... ), etc... 
from users m, someTable sm etc... 
where m.USERID in (select m2.USERID from users where rnum <= ? and rnum > ?) 


вот что-то типа такого smile 

Перекладывание из "большой" в "маленькую" табличку делается для ускорения расчетов над этой таблице, суммирования и т.п.
Могу еще добавить что в исходной таблице хранятся денежные транзакции юзеров. Их там очень много. Новые транзакции добавляются примерно раз в 5 сек.
PM MAIL   Вверх
DimW
Дата 28.9.2009, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 3
Всего: 44



Цитата(5ad1sT @  25.9.2009,  15:56 Найти цитируемый пост)
Во временной таблице данные из одной таблицы.

теперь понятно.

по поводу временных таблиц и потери в них данных. время жизни данных во временных таблицах либо транзакция(данные очищаются при подтверждении транзакции) либо сессия (данные очищаются при закрытии сесии).
какой вариан у вас пока не понытно, склоняюсь в сторону последнего.

сколько http сессий обращаются к этим данным, если больше одной то это и есть причина потери данных ибо коннект в БД у вас другой.


Цитата(5ad1sT @  25.9.2009,  12:22 Найти цитируемый пост)
Собственно пример получения коннекта:

если коннект из пула доставляет вам не удобства в данной ситуации, то как вариант - организуйте коннект к БД сами(используя JDBC) и закрывайте наздоровье когда вам удобно.

PS. если есть желание более подробно пообщаться на тему оптимизации процесса подготовки пачек данных, то милости просим в ветку по БД, и не забудьте как можно точнее сформулировать требования и особенности процесса.
PM MAIL ICQ   Вверх
5ad1sT
Дата 28.9.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 10.2.2009

Репутация: нет
Всего: нет



Спасибо. Будем думать smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.