powered by simpleCommunicator - 2.0.43     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Многопоточный доступ
14 сообщений из 14, страница 1 из 1
Многопоточный доступ
    #33478123
sadik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть приложение, через которое различные клиенты подключаются к базе. Число клиентов пока исчисляется десятками. Механизм таков: для каждого клиента создается отдельный поток, в нем отдельная сессия к Ораклу (используется Delphi, DOA). Запрос селект из функции, которая возвращает набор данных. Раньше использовалась одна сессия для всех потоков в режиме ThreadSafe, но в один прекрасный момент при интенсивном доступе сессия просто повисала. В документации по ДОА было сказано, что начиная с 9-ки оракл сам как-то может управлять пулом сессий, т.е., он их как-то переиспользует, а не создает новые.
Обработка запросов происходит в пакете. Создается локальная переменная в процедуре (объектного типа) и передается дальнейшим обработчикам как параметр in out nocopy. Обработчики вызываются с использованием динамического SQL, поэтому пришлось объявить типы в схеме для для переменных, чтобы компилился динамик SQL.
Как известно, переменные пакета инициализируются на каждую сессию. Хотелось бы уйти от объявления типов в схеме и все реализовать на уровне пакета (раньше было на 8-ке, теперь на 10-ке), поскольку начиная с 9-ки можно использовать pipelined ф-ции и не надо в запросе делать приведение к конкретному типу. Удобней и лучше. И можно уйти от передачи параметров для всех ф-ций, если объявить глобальные переменный пакета и соотв. типы в виде записей и массивов.

Ох... что-то записался.
И вот ситуация: пока мы используем отдельные сессии на каждый поток приложения и если сделать через глобальные переменные пакета - то можно сказать, что они проинициализируются правильно и не перезапишутсья другими. А вот, если использовать пул сессий то будут ли они инициализироваться для каждого запроса или нет?
Просто, приложение жрет много памяти, надо оптимизировать, но надо разобраться конкретней, в чем проблема. Если клиентов будет пару сотен - ох, боюсь загнется... при одновременном доступе. Можно сократить число сессий в приложении и использовать пул сессий. но, нормальной доки нету ни по ДОА ни по ораклу я не нашел.
Есть ли какая дока или может кто сталкивался с подобным. Сорри за многословность, короче не получилось... Т.е., как бы правильно оргиназивать многопоточный (допустим интенсивный) доступ с инициализацией переменных пакета для каждого запроса.
Если кто ответит на мой бред - буду благодарен...
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33478154
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боюсь соврать, но с пулом соединений и пакетными переменными, боюсь, ничего хорошего не получится.
В таком режиме работает сервер приложений - можно сходить на technet.oracle.com и почитать best practicles для Application Server.
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33478250
sadik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousБоюсь соврать, но с пулом соединений и пакетными переменными, боюсь, ничего хорошего не получится.
В таком режиме работает сервер приложений - можно сходить на technet.oracle.com и почитать best practicles для Application Server.

Понятно... У меня тоже как-бы сервер приложений. Вот смутили немного эти пакетные переменные. Вот я и думаю, где бы лучше оптимизировать, то ли разобраться с этим зверем пула сессий и сократить как-то, то ли переписать стурктуры данных в потоках сервера приложений, уж жрет память, собака, это как бы первый момент.
Второй момент - оптимизировать код пакета. Просто, эти вещи оказываются зависимы...
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33478398
sadik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто-нить работал с пулом сессий. (например, через DOA)?
Может есть примеры, грабли, советы?
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33478427
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какая-то дурацкая задача
тот кто разработал эту архитектуру никогда не работал с ораклом

идти надо от того какая у вас система DSS или OLTP
если OLTP и клиентов сотни (не десятки), то надо врубать в оракле режим MTS

sadikЕсть приложение, через которое различные клиенты подключаются к базе.
с какой целью сделан этот огород? зачем вам прослойка между бд и клиентами?
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33478437
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Simonкакая-то дурацкая задача
тот кто разработал эту архитектуру никогда не работал с ораклом
идти надо от того какая у вас система DSS или OLTP
если OLTP и клиентов сотни (не десятки), то надо врубать в оракле режим MTS
sadikЕсть приложение, через которое различные клиенты подключаются к базе.
с какой целью сделан этот огород? зачем вам прослойка между бд и клиентами?
Спокойнее надо быть - человек же писал, что у них самопальный сервер приложений.
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33478466
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у всех самопальные сервера приложений

при десятках клиентов надо открывать каждому потоку в приложении отдельную сессию в оракле и не мучаться
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33478480
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если хочешь, пришлю тебе manual.pdf
но там про это очень немного, в основном, описание свойств/методов
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33478482
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Simonу всех самопальные сервера приложений
при десятках клиентов надо открывать каждому потоку в приложении отдельную сессию в оракле и не мучаться
Перечитайте первоначальный пост :)
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33478484
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TOracleSessionPool component
Unit
Oracle
Description
In server applications that frequently need to create sessions to process requests from client
applications, it may be useful to use connection pooling. Without a pooling concept, each
request could lead to an actual database logon and logoff. By using the TOracleSessionPool
component, you can maintan a pool of database sessions that can be used and reused for
different requests. You can define the minumum an maximum number of sessions in the pool,
define the TimeOut behavior for idle sessions in the pool, and preset the username, password
and database.
Once you have created a pool, you can assign a TOracleSession to this pool by setting its
Pool property.
The global pool
Instead of creating a specific session pool and assigning sessions to it, you can alternatively
make use the global pool. The Oracle unit contains a global SessionPool variable that will be
used for pooled sessions that do not have their Pool property set. Using the global pool will be
sufficient for most applications. Note however that you need to set the SessionPool properties
before connecting any pooled sessions.
Default pooling vs Oracle pooling (Oracle 9.2 or later)
Oracle 9.2 introduced its own session pooling mechanism. You can make use of this
functionality by setting the PoolType property to ptOracle. Oracle 9.2 pooling is more efficient,
but also has the restriction that you cannot have sessions for more than one database in the
same pool. If this restriction is not a problem, you should use Oracle pooling.
TOracleSessionPool reference
This chapter describes all properties, methods and events of the TOracleSessionPool
component.

<А далее опсания свойств и т.д.>
TOracleSessionPool.AfterReserve
Declaration
type TSessionPoolSessionEvent = procedure(Sender: TOracleSessionPool;
Session: TOracleSession) of Object;
property AfterReserve: TSessionPoolSessionEvent;
Description
This event is fired after a session reserves a connection from the pool.
<...>
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33478671
sadik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Simonкакая-то дурацкая задача
тот кто разработал эту архитектуру никогда не работал с ораклом

идти надо от того какая у вас система DSS или OLTP
если OLTP и клиентов сотни (не десятки), то надо врубать в оракле режим MTS

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

На счет дурацкой задачи - разработывал сам. Я по большей степени прогер, сам писал и сервер приложений, и все остальное. По мере деятельности приходтся заниматься всем, и пытаться админить оракл и все дыры затыкать (как наверное и большинству :)) . На все толком не хватает времени. Ну вот, результат есть, работает, внедрение на днях начинается, поезд приезжает. Но, есть угловые моменты, которые меня не совсем устаривают (попытался изложить выше с техническими особенностями реализации) и надо думать о будущем :) . Просто, на описание задачи не хотел тратить много слов.
Но идея проста. Есть TCP-сервак (тот самый сервер приложений, если так моно назвать). На него подключаются скан-терминалы, которые передают информацию (штрих-коды и прочую системную лабуду) по TCP протоколу. Я все это принимаю, пихаю в БД, отправляю ответы, даю команды другим модулям системы и т.д... Терминалы напрямую не могуть подключаться к БД.
Вот и и хотел спросить вас, умных людей, можно ли оптимизировать ресурсы проекта.

Клиентов пока десятки, но боюсь могут будут сотни (маловероятно, пока нет другого заказчика). За совет - спасибо. Буду рад, если еще кто отзовется :)

На счет того, кто работал с ораклом или не работал - это вопрос (в чем заключается работа? писать код, тюнить и прочее - разные веСчи). Все конечно не постичь, но стремится надо.
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33478676
sadik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymxесли хочешь, пришлю тебе manual.pdf
но там про это очень немного, в основном, описание свойств/методов
Спасибо, за мануал. Я его раньше лопатил, пока время было. Но сроки горели, пришлось сделать пока как работает.
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33479088
AlexVer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sadikКто-нить работал с пулом сессий. (например, через DOA)?
Может есть примеры, грабли, советы?

Работать с пулом соединений и различать кто подключен к серверу через это соединение можно через установку контекста при каждом вызове с клиента. Например:

PROCEDURE SET_CTX_APPUSER(APP_USER VARCHAR2) IS
BEGIN
dbms_session.set_context('schr',
'app_user',
APP_USER,
SYS_CONTEXT('USERENV', 'SESSION_USER'),
APP_USER);
END SET_CTX_APPUSER;

, а потом уже в пакете проверять контест и производить необходмые действия:

USER_NAME := SYS_CONTEXT('SCHR', 'APP_USER');
...
...
Рейтинг: 0 / 0
Многопоточный доступ
    #33479411
sadik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexVer sadikКто-нить работал с пулом сессий. (например, через DOA)?
Может есть примеры, грабли, советы?

Работать с пулом соединений и различать кто подключен к серверу через это соединение можно через установку контекста при каждом вызове с клиента. Например:

PROCEDURE SET_CTX_APPUSER(APP_USER VARCHAR2) IS
BEGIN
dbms_session.set_context('schr',
'app_user',
APP_USER,
SYS_CONTEXT('USERENV', 'SESSION_USER'),
APP_USER);
END SET_CTX_APPUSER;

, а потом уже в пакете проверять контест и производить необходмые действия:

USER_NAME := SYS_CONTEXT('SCHR', 'APP_USER');
...

ага, спасибо. покопаем.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Многопоточный доступ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]