![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Вопросы:
как минимизировать число подключений к базе данных ? как это можно сделать руками без готовых модулей ? Имеем: apache2, mod_perl2, есть CPAN =) готовые варианты: Apache::DBI Apache::DBI::Cache Apache::BabyConnect все эти модули предоставляют persistent connection - это замечательно! но я так и не нашел в документации разделяются ли эти соединения между потоками. ясно, что каждый _процесс_ apache обязан иметь свое соединение, а потоки ? неясно какую модель потоков использует mod_perl2, можно ли разделять переменные с помощью
и написать собственный пул для DBI соединений или необходимо делать разделение на уровене C кода ? |
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
||||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
сорри, но фактически вы не сказали ничего нового.
|
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
sir_nuf_nuf, не подскажите, чем, по-вашему, потоки отличаются от процессов с точки зрения использования БД?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Разные процессы - имеют разное адресное пространство -> они не могут разделять db handle.
т.е. приницпиально не возможно использовать одно соединение для нескольких процессов ( ну если не думать в сторону POSIX shmem) Разные потоки имеют общее адресное пространство -> db handle созданный в одном потоке можно использовать из другого, достаточно немного подумать о синхронизации, что бы один и тот же handle не использовался параллельно. в j2ee часто делаю так: создают pool соединений с базой, каждый поток может брать от туда соединения и возвращать обратно. при этом соединения остаются всегда открытыми. Т.к. соединение нужно потоку не 100% времени, то число соединений может быть меньше числа потоков. разница между потоками и процессами в это отношении - это адресное пространство. |
|||
|
||||
konstant1n |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 6.4.2008 Репутация: нет Всего: нет |
некоторое время назад тоже думал на над этой проблемой. Если кратко то легко проблема внутри mod_perl не решается, т.к. нет простого механизма доступа к одним и тем-же данным из разных потоков апача.
проблема решилась с помощью стороннего софта который организует connection pool. В нашем случае это pgbauncer, прокси-пул для постгреса. https://developer.skype.com/SkypeGarage/DbProjects/PgBouncer Для постгреса есть еще pgpool и pgpool-II. Также pgODBC драйвер под виндой умеет делать connection pool. На сколько я знаю MySQL ODBC драйвер тоже поддерживает connection pool. Про другие базы и конекторы не скажу т.к. не знаю. Если охота делать из под mod_perl то смотрите на модули APR::Pool и APR::Table которые являются обертками к apr_pool_t и apr_table_t ( http://apr.apache.org/docs/apr/1.2/ ) С их помощью можно обмениваться данными через внутренние структуры данных апача. Что меня остановило так это отсутствие примеров как работать со всем этим делом, а время в в проекте было ограничено. В доке показан лишь частный случай создание APR::Pool уровня запроса, а тут нужен уровень процесса. Так же советую проанализировать ситуацию на предмет "а оно надо?", поясню: 1) если идет речь о высоко-нагруженном веб сервисе то реально открытое соединение к базе нужно всем процессам апача т.к. они должны не спать а занимается делом -- обрабатывать данные, соответственно постоянно читать/писать в базу. Задачу обработки "медленных" клиентов и очереди лучше отдать какой-нибудь proxy. 2) если имеем дело с небольшой нагрузкой -- может и так сойдет, скорее всего узкое место будет не в количестве конектов к базе. |
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Спасибо! разумный ответ!
на самом деле не сильно надо. =) просто смущала неясность - как такое организовать.. ответ не радостный - легко не получится. |
|||
|
||||
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |