| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Хранение Connection в сессии |
| Автор: 5ad1sT 25.9.2009, 12:22 | ||
| Есть приложение работающее с БД Oracle через пул коннектов. Для доступа к бд используется Hibernate + spring. Все отлично, но вот есть одна проблемка. Иногда требуется подключаться к БД и выполнять запросы на прямую, без Hibernate. Собственно пример получения коннекта:
Все красиво работает, соответственно в конце метода коннект закрывается. Но, поскольку таблицы из которых выбираются данные, огромных размеров, то создаются временные (TEMP) и потом из них идет уже выборка. Эти таблицы создаются вначале этого метода. Проблема состоит в том, что этот метод вызывается несколько десятков раз подряд, тоесть он выдает информацию порциями и каждый раз создаются TEMP таблицы... это грузит БД, но работает Был предпринят шаг к оптимизации. TEMP таблицы создавались один раз, перед выборкой данных порциями. В результате выборка работала через раз... т.к. терялась сессия с Ораклом и для данной сессии в таблицах уже небыло нужной информации. Есть предложение хранить Коннекшн отдельно, в сессии, или еще где посоветуете, но вот как это лучше реализовать? и есть ли вообще выход из этой ситуации? Заранее спасибо. |
| Автор: 5ad1sT 25.9.2009, 13:50 | ||||
Сессия теряется скорее всего из-за того что в каждой порции мы получаем коннекшн, а потом его закрываем, соответственно он улетает в пул.. а в следующий раз у нас уже может быть другой коннекшн и соответственно уже и сессия с ораклом другая... На счет материализованных представлений, http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5 То я не думаю что это на подойдет. Данные во временных таблицах должны быть в исходном виде, а не сводные и т.п. Это делается для того чтобы не проходить по нескольким миллионам записей, а из много меньшего количества записей выбирать. Я думаю просто как вариант для всех порций вначале получить один коннекшн, не закрывая его, выбирать данные, а в конце закрыть. Но вот где его хранить ? |
| Автор: DimW 25.9.2009, 14:27 | ||||||
приведите пример выборки данных порцией.
интересно как вы формируете меньший набор данных не проходя многомиллионный?
если при получении вы используете одну http сессию, то в ней и храните, только вот проблемы ваши не сводятся к хранению коннекта... Добавлено через 4 минуты и 12 секунд
не стоит черпать знания по трем строчкам из wiki, это лишь малая часть вершины айсберга. |
| Автор: 5ad1sT 25.9.2009, 15:13 |
| Суть порций в том что из временной таблицы выбираются данные регулируясь rownum'ами, тоесть к примеру, сначала первые 100, потом следующие 100 и т.д. После выборки порции, данные обрабатываются и выдаются в поток в виде xml. Я не говорил что мы не проходим по большой таблице, просто мы по ней проходим один раз На счет материализованных представлений, то тут не так все просто. Я с ними пока знаком очень поверхностно. Но, уже могу сказать что они нам скорее всего не очень помогут, возможно я ошибаюсь... Еще вопросик знающим (пока-что сам не дошел до этого): Могут ли МП быть созданы для n количества запросов одновременно? Тоесть несколько запросов с разным промежутком времени (прим: за вчера и за прошлый год). |
| Автор: DimW 25.9.2009, 15:36 | ||||||
вот этот момент не мешало бы уточнить. 1) вы перекладываете данные из одной таблицы в другую(во временную), а потом эти же данные режите и формируете по ним XML? 2)во временную таблицу помещаются данные сводные из нескольких таблиц? возможно я тоже, но для этого нужно понять как вы формируете итоговый набор, и какую цель вы приследовали перекладывая его во временную таблицу.
если количество выводимых полей и их типы совподают то выглядеть это должно примерно так:
вслучае если данные за разные периоды беруться из одной таблицы, то ни что не мешает их получать одним запросом используя OR. |
| Автор: 5ad1sT 25.9.2009, 15:56 | ||
| Во временной таблице данные из одной таблицы. Но, в самом запросе используется еще дополнительно пара таблиц связанных между собой. Запрос сейчас строится примерно так:
вот что-то типа такого Перекладывание из "большой" в "маленькую" табличку делается для ускорения расчетов над этой таблице, суммирования и т.п. Могу еще добавить что в исходной таблице хранятся денежные транзакции юзеров. Их там очень много. Новые транзакции добавляются примерно раз в 5 сек. |
| Автор: DimW 28.9.2009, 07:08 |
теперь понятно. по поводу временных таблиц и потери в них данных. время жизни данных во временных таблицах http://orasource.ru/vremennyie-tablitsyi-v-oracle.html какой вариан у вас пока не понытно, склоняюсь в сторону последнего. сколько http сессий обращаются к этим данным, если больше одной то это и есть причина потери данных ибо коннект в БД у вас другой. если коннект из пула доставляет вам не удобства в данной ситуации, то как вариант - организуйте коннект к БД сами(используя JDBC) и закрывайте наздоровье когда вам удобно. PS. если есть желание более подробно пообщаться на тему оптимизации процесса подготовки пачек данных, то милости просим в ветку по БД, и не забудьте как можно точнее сформулировать требования и особенности процесса. |
| Автор: 5ad1sT 28.9.2009, 16:57 |
| Спасибо. Будем думать |