| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Разделение DBI соединений между потоками. |
| Автор: sir_nuf_nuf 25.3.2008, 19:33 | ||
| Вопросы: как минимизировать число подключений к базе данных ? как это можно сделать руками без готовых модулей ? Имеем: apache2, mod_perl2, есть CPAN =) готовые варианты: Apache::DBI Apache::DBI::Cache Apache::BabyConnect все эти модули предоставляют persistent connection - это замечательно! но я так и не нашел в документации разделяются ли эти соединения между потоками. ясно, что каждый _процесс_ apache обязан иметь свое соединение, а потоки ? неясно какую модель потоков использует mod_perl2, можно ли разделять переменные с помощью
и написать собственный пул для DBI соединений или необходимо делать разделение на уровене C кода ? |
| Автор: vadiml 25.3.2008, 20:50 |
| я фактически ответил в http://forum.vingrad.ru/index.php?showtopic=202438&view=findpost&p=1455109 |
| Автор: sir_nuf_nuf 26.3.2008, 00:38 |
| сорри, но фактически вы не сказали ничего нового. |
| Автор: ginnie 26.3.2008, 11:54 |
| sir_nuf_nuf, не подскажите, чем, по-вашему, потоки отличаются от процессов с точки зрения использования БД? |
| Автор: sir_nuf_nuf 26.3.2008, 15:06 |
| Разные процессы - имеют разное адресное пространство -> они не могут разделять db handle. т.е. приницпиально не возможно использовать одно соединение для нескольких процессов ( ну если не думать в сторону POSIX shmem) Разные потоки имеют общее адресное пространство -> db handle созданный в одном потоке можно использовать из другого, достаточно немного подумать о синхронизации, что бы один и тот же handle не использовался параллельно. в j2ee часто делаю так: создают pool соединений с базой, каждый поток может брать от туда соединения и возвращать обратно. при этом соединения остаются всегда открытыми. Т.к. соединение нужно потоку не 100% времени, то число соединений может быть меньше числа потоков. разница между потоками и процессами в это отношении - это адресное пространство. |
| Автор: konstant1n 6.4.2008, 10:02 |
| некоторое время назад тоже думал на над этой проблемой. Если кратко то легко проблема внутри 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 7.4.2008, 07:17 |
| Спасибо! разумный ответ! на самом деле не сильно надо. =) просто смущала неясность - как такое организовать.. ответ не радостный - легко не получится. |
| Автор: gcc 25.4.2009, 17:42 |
| случайно увидел http://search.cpan.org/~darnold/DBIx-Threaded-0.10/lib/DBIx/Threaded.pm |