|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
Есть приложение, через которое различные клиенты подключаются к базе. Число клиентов пока исчисляется десятками. Механизм таков: для каждого клиента создается отдельный поток, в нем отдельная сессия к Ораклу (используется Delphi, DOA). Запрос селект из функции, которая возвращает набор данных. Раньше использовалась одна сессия для всех потоков в режиме ThreadSafe, но в один прекрасный момент при интенсивном доступе сессия просто повисала. В документации по ДОА было сказано, что начиная с 9-ки оракл сам как-то может управлять пулом сессий, т.е., он их как-то переиспользует, а не создает новые. Обработка запросов происходит в пакете. Создается локальная переменная в процедуре (объектного типа) и передается дальнейшим обработчикам как параметр in out nocopy. Обработчики вызываются с использованием динамического SQL, поэтому пришлось объявить типы в схеме для для переменных, чтобы компилился динамик SQL. Как известно, переменные пакета инициализируются на каждую сессию. Хотелось бы уйти от объявления типов в схеме и все реализовать на уровне пакета (раньше было на 8-ке, теперь на 10-ке), поскольку начиная с 9-ки можно использовать pipelined ф-ции и не надо в запросе делать приведение к конкретному типу. Удобней и лучше. И можно уйти от передачи параметров для всех ф-ций, если объявить глобальные переменный пакета и соотв. типы в виде записей и массивов. Ох... что-то записался. И вот ситуация: пока мы используем отдельные сессии на каждый поток приложения и если сделать через глобальные переменные пакета - то можно сказать, что они проинициализируются правильно и не перезапишутсья другими. А вот, если использовать пул сессий то будут ли они инициализироваться для каждого запроса или нет? Просто, приложение жрет много памяти, надо оптимизировать, но надо разобраться конкретней, в чем проблема. Если клиентов будет пару сотен - ох, боюсь загнется... при одновременном доступе. Можно сократить число сессий в приложении и использовать пул сессий. но, нормальной доки нету ни по ДОА ни по ораклу я не нашел. Есть ли какая дока или может кто сталкивался с подобным. Сорри за многословность, короче не получилось... Т.е., как бы правильно оргиназивать многопоточный (допустим интенсивный) доступ с инициализацией переменных пакета для каждого запроса. Если кто ответит на мой бред - буду благодарен... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 10:40 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
Боюсь соврать, но с пулом соединений и пакетными переменными, боюсь, ничего хорошего не получится. В таком режиме работает сервер приложений - можно сходить на technet.oracle.com и почитать best practicles для Application Server. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 10:47 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
andrey_anonymousБоюсь соврать, но с пулом соединений и пакетными переменными, боюсь, ничего хорошего не получится. В таком режиме работает сервер приложений - можно сходить на technet.oracle.com и почитать best practicles для Application Server. Понятно... У меня тоже как-бы сервер приложений. Вот смутили немного эти пакетные переменные. Вот я и думаю, где бы лучше оптимизировать, то ли разобраться с этим зверем пула сессий и сократить как-то, то ли переписать стурктуры данных в потоках сервера приложений, уж жрет память, собака, это как бы первый момент. Второй момент - оптимизировать код пакета. Просто, эти вещи оказываются зависимы... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 11:14 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
Кто-нить работал с пулом сессий. (например, через DOA)? Может есть примеры, грабли, советы? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 11:41 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
какая-то дурацкая задача тот кто разработал эту архитектуру никогда не работал с ораклом идти надо от того какая у вас система DSS или OLTP если OLTP и клиентов сотни (не десятки), то надо врубать в оракле режим MTS sadikЕсть приложение, через которое различные клиенты подключаются к базе. с какой целью сделан этот огород? зачем вам прослойка между бд и клиентами? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 11:47 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
Simonкакая-то дурацкая задача тот кто разработал эту архитектуру никогда не работал с ораклом идти надо от того какая у вас система DSS или OLTP если OLTP и клиентов сотни (не десятки), то надо врубать в оракле режим MTS sadikЕсть приложение, через которое различные клиенты подключаются к базе. с какой целью сделан этот огород? зачем вам прослойка между бд и клиентами? Спокойнее надо быть - человек же писал, что у них самопальный сервер приложений. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 11:48 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
у всех самопальные сервера приложений при десятках клиентов надо открывать каждому потоку в приложении отдельную сессию в оракле и не мучаться ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 11:53 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
если хочешь, пришлю тебе manual.pdf но там про это очень немного, в основном, описание свойств/методов ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 11:55 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
Simonу всех самопальные сервера приложений при десятках клиентов надо открывать каждому потоку в приложении отдельную сессию в оракле и не мучаться Перечитайте первоначальный пост :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 11:56 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
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. <...> ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 11:57 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
Simonкакая-то дурацкая задача тот кто разработал эту архитектуру никогда не работал с ораклом идти надо от того какая у вас система DSS или OLTP если OLTP и клиентов сотни (не десятки), то надо врубать в оракле режим MTS sadikЕсть приложение, через которое различные клиенты подключаются к базе. с какой целью сделан этот огород? зачем вам прослойка между бд и клиентами? На счет дурацкой задачи - разработывал сам. Я по большей степени прогер, сам писал и сервер приложений, и все остальное. По мере деятельности приходтся заниматься всем, и пытаться админить оракл и все дыры затыкать (как наверное и большинству :)) . На все толком не хватает времени. Ну вот, результат есть, работает, внедрение на днях начинается, поезд приезжает. Но, есть угловые моменты, которые меня не совсем устаривают (попытался изложить выше с техническими особенностями реализации) и надо думать о будущем :) . Просто, на описание задачи не хотел тратить много слов. Но идея проста. Есть TCP-сервак (тот самый сервер приложений, если так моно назвать). На него подключаются скан-терминалы, которые передают информацию (штрих-коды и прочую системную лабуду) по TCP протоколу. Я все это принимаю, пихаю в БД, отправляю ответы, даю команды другим модулям системы и т.д... Терминалы напрямую не могуть подключаться к БД. Вот и и хотел спросить вас, умных людей, можно ли оптимизировать ресурсы проекта. Клиентов пока десятки, но боюсь могут будут сотни (маловероятно, пока нет другого заказчика). За совет - спасибо. Буду рад, если еще кто отзовется :) На счет того, кто работал с ораклом или не работал - это вопрос (в чем заключается работа? писать код, тюнить и прочее - разные веСчи). Все конечно не постичь, но стремится надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 12:32 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
andreymxесли хочешь, пришлю тебе manual.pdf но там про это очень немного, в основном, описание свойств/методов Спасибо, за мануал. Я его раньше лопатил, пока время было. Но сроки горели, пришлось сделать пока как работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 12:34 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
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'); ... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 14:22 |
|
Многопоточный доступ
|
|||
---|---|---|---|
#18+
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'); ... ага, спасибо. покопаем. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2006, 15:52 |
|
|
start [/forum/topic.php?fid=52&gotonew=1&tid=1965537]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
13ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
128ms |
get tp. blocked users: |
2ms |
others: | 244ms |
total: | 462ms |
0 / 0 |