Могу ли я использовать многопоточность с DBI и Oracle в Perl? - PullRequest
6 голосов
/ 16 декабря 2008

Кто-нибудь знает о каких-либо проблемах или проблемах при написании многопоточных приложений на Perl с использованием Oracle DBI? Каждый поток будет иметь свое собственное соединение с Oracle.

Долгое время мне говорили, что многопоточность не поддерживается в Perl с Oracle.

Ответы [ 6 ]

5 голосов
/ 16 декабря 2008

Perl DBI обеспечивает однопоточность внутри, поэтому драйверы будут активны только в течение одного сеанса ($dbh) за раз. Независимо от того, сколько у вас процессоров. Таким образом, многопоточность не поддерживается (поскольку все внутри DBI является однопоточным), но безопасно использовать DBI (и, следовательно, DBD :: Oracle) в многопоточном приложении.

2 голосов
/ 17 декабря 2008

Что ж, в документации DBI говорится, что не следует использовать Perl с резьбой, и указывается на публикацию Perlmonks, в которой объясняется, что . Документация, говорящая вам не делать этого, является довольно веской причиной.

Тем не менее, я видел, что на некоторых платформах он работает нормально, а на других - с треском. Это, конечно, не переносимо, даже если вы заставите его работать.

1 голос
/ 11 июня 2009

Я использовал многопоточность в Perl для сравнительного анализа базы данных Oracle, и мне пришлось создать обработчик базы данных для каждого потока.

0 голосов
/ 06 августа 2010

Вместо этого вы можете попробовать использовать «многопоточность» оболочки. Описано в http://alexhanin.blogspot.com/2010/07/multithreading-with-nothing-but-korn.html Вы можете поместить свой Perl в оболочку оболочки, а затем использовать каждый «поток» оболочки как отдельный экземпляр программы.

0 голосов
/ 01 июля 2009

Некоторое время назад Мне удалось заставить работать реализацию ad-hock ... Я рассмотрел соединение w / dbi как ограниченный ресурс и поделился им с различными потоками в Perl, используя механизм блокировки файлов , Мое многопоточное приложение когда-либо подключалось к dbi только через отдельный perl-скрипт, работающий как демон.

В Linux многопоточное завершение выполнялось с помощью fork, в Windows я использовал все, что было в стандартной реализации activeperl (я забыл)

Я пытался заставить их общаться через общую память, но вместо этого использовал общий файл. У Linux есть надежный режим добавления, так что это было просто. В Windows их было намного сложнее синхронизировать.

Недавно Я изучил транзакции базы данных, каждый экземпляр потока имел свое собственное соединение с базой данных и позволял базе данных обрабатывать детали соединения.

Это с mysql, но я уверен, что oracle поддерживает транзакции.

apache :: dbi хорошо работает / работает с mod_perl, поддерживая эти соединения между каждым прогоном скрипта (до того, как я использовал это, каждое соединение было довольно трудоемким).

Ваши результаты будут отличаться.

0 голосов
/ 16 декабря 2008

Да, использование потоков в Perl - очень плохая идея, независимо от того, используете вы Oracle или нет.

Хотя теоретически, при условии, что каждый использует свое собственное соединение, он должен работать, потоки perl 5.8 в корне ошибочны .

Если вы понимаете эту статью и все еще хотите использовать потоки Perl, удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...