Создание "персональных" постоянных соединений

max2k1

Guest
Создание "персональных" постоянных соединений

Есть такая проблема:
сайт с авторизацией на php5. База на Oracle 9.2. В работе сайта активно используются sessions.
К базе цепляюсь определенным пользователем (через oci_new_connect), далее вызывается хранимая процедура Login посредством которой аутентифицируется и авторизуется пользователь. При этом происходит установка SYS_CONTEXT'ов, необходимых для fine-grained доступа к таблицам.
Соответственно, на каждый клик пользователя выполняется одна и та же достаточно тяжелая процедура, да еще и в рамках нового коннекта, что, конечно, отвратительным образом сказывается на производительности.
Очень хочется каким-то образом научиться использовать для данного зарегистрированного пользователя что-то вроде постоянного соединения и не запускать процедуры авторизации заново. Т.е. oci_new_connect только один на все время жизни сессии. Пытался через _SESSION сохранять resource_handle соединения, но oci8 упорно не желает его повторно использовать:
Код:
supplied argument is not a valid OCI8-Connection resource
Существуют ли все-таки какие-то варианты решения этой задачи?
 

tony2001

TeaM PHPClub
>Пытался через _SESSION сохранять resource_handle соединения
гм. ну пытаться сохранять ресурсы в текст - это вообще достаточно странно...
как вы себе представляете *текстовое представление соединения* ?

>К базе цепляюсь определенным пользователем (через oci_new_connect),
используйте oci_pconnect().
через X запросов на всех N чайлдах будут висеть уже открытые соединения с этим юзером.
правда, это никоим образом не влияет на хранимые процедуры и т.п.
просто само соединение уже будет открыто и вернется вам после поиска (и нахождения) в списке.
поиск идёт по деталям - логин, имя базы, charset.
 

max2k1

Guest
Автор оригинала: tony2001
гм. ну пытаться сохранять ресурсы в текст - это вообще достаточно странно...
как вы себе представляете *текстовое представление соединения* ?
по сути, я пытался сохранять только результат oci_new_connect, надеясь на то, что это обычный handle ресурса, который (без disconnect) не будет разрушен и при следующем соединении клиента с Apache, но, видимо, ошибся.

Автор оригинала: tony2001
используйте oci_pconnect().
через X запросов на всех N чайлдах будут висеть уже открытые соединения с этим юзером.
правда, это никоим образом не влияет на хранимые процедуры и т.п.
просто само соединение уже будет открыто и вернется вам после поиска (и нахождения) в списке.
поиск идёт по деталям - логин, имя базы, charset.
Толку не будет - пользователь базы у меня всегда один и тот же. Аутентификация идет уже внутри package'а, по имени и паролю, вводимых пользователем.
 

Falc

Новичок
max2k1
>>пользователь базы у меня всегда один и тот же
Вот и прекрасно делаешь oci_pconnect() и соединение у тебя будет постояным, а результаты своей аунтификации сохраняешь в сесии.
 

max2k1

Guest
Автор оригинала: Falc
max2k1
>>пользователь базы у меня всегда один и тот же
Вот и прекрасно делаешь oci_pconnect() и соединение у тебя будет постояным, а результаты своей аунтификации сохраняешь в сесии.
Мне надо сохранять не состояние клиентской сессии со стороны Apache/php, а состояние Oracle'овых переменных и sys_context'ов, а это достижимо только в рамках единого коннекта для всей сессии, но разных коннектов для различных сессий. Во как завернул :)
 

Falc

Новичок
max2k1
Похоже использовать твоию систему авторизации на связке apache/php без повторного логина при каждом реквесте не получится.

отсюда выводы:
1. Попытатся сохранить в php-сессии то что ты хранишь в sys_contexst'ах (не уверен что это возможно и правильно)
2. Перейти на другую веб технологию, на сколько я слышал asp.net умеет хранить пул коннектов и возможно там такое получится (сам я с asp.net дела не имел)
3. Переписать авторизацию или использовать ораклевую. (по-моему самое верное решение)
4. Оставить все как есть и при необходимости большей производительности ускорять существующую реализацию авторизации или наращивать мощьность аппаратной платформы :)
 

tony2001

TeaM PHPClub
>по сути, я пытался сохранять только результат oci_new_connect, надеясь на то,
>что это обычный handle ресурса
это обычный ресурс, да.
просто ресурсы в принципе не подлежат сериализации. все.

>Похоже использовать твоию систему авторизации на связке apache/php без
> повторного логина при каждом реквесте не получится.
конечно, без повторного PL/SQL-логина.
раз там есть логин, то есть и логаут.
значит, делать логаут в конце скрипта.

при условии, что с системой могут работать > 1 пользователя, а авторизация фактически идёт через какие-то внешние источники, я другого пути не вижу.
 
Сверху