2016-09-06 8 views
0

У меня есть приложение Perl в Windows, которое использует потоки, которые работают параллельно. Каждый поток обращается к базе данных MSSQL.Проблема с потоком Perl и MS SQL

Я понимаю, что не могу использовать Win32::OLE, потому что он не является потокобезопасным.

Не могли бы вы предложить мне еще одно подходящее решение для этого?

  • Создать службу Windows, которая будет обращаться к базе данных как к одному потоку, и Perl будет использовать эту услугу?

  • Создать еще один сервер приложений Perl, который будет иметь доступ к БД в качестве приложения с одним потоком, а потоки Perl будут использовать эту услугу?

  • Использовать библиотеку Win32::OLE (DBI) только в дочерних потоках или каким-либо безопасным способом?

Я не знаю, каков правильный путь, и какими могут быть способы его решения.

+0

Прошу прощения, если я тускнею, но что делает DBI с Win32 :: OLE? Я не вижу проблем с предоставлением многопоточного доступа к базе данных с использованием [DBI] (https://metacpan.org/pod/DBI) – Borodin

+0

Я думал, что Perl DBI-библиотека использует в моем случае библиотеку Win32 :: OLE и, следовательно, не сохраняет подключитесь к базе данных с помощью $ con = DBI-> connect ("dbi: ADO: ...). – stepan

+0

Вам необходимо использовать соединение ODBC с помощью [DBD :: ODBC] (https://metacpan.org/pod/ DBD :: ODBC), но [DBI] (https://metacpan.org/pod/DBI) не зависит от каких-либо модулей, кроме некоторых требований времени сборки и драйверов DBD. – Borodin

ответ

0

DBI не зависит от ничего, кроме обычной сборки и тестирования модулей, которые используются во время установки

Там нет DBD драйвера для SQL Server (я не ясно, почему. Может быть, кто-нибудь просветить меня?) так что вам нужно будет использовать соединение ODBC с помощью драйвера DBD::ODBC

Я уверен, как DBI ведет себя под потоками, и я предлагаю вам использовать fork вместо которых эмулируется на версиях Windows, в Perl. Вам нужно будет установить $dbh->{AutoInactiveDestroy} = 1, чтобы предотвратить процессы из базы данных автоматического уничтожения и инструкции, если они не должны

0

Как предложено @Borodin, почему бы не использовать DBIx::Class?

Это потокобезопасный. Возможно, вам лучше объяснить, как ваше приложение имеет доступ к базе данных. Кажется, что у вас есть «сервер Windows», который является своего рода Perl-модулем, который использует Win32 :: OLE, и этот сервер активно разговаривает с базой данных.

+0

Существует огромный опыт ng для 'DBIx :: Class', и это зависит от большого количества вспомогательных дочерних модулей:' Class :: Accessor :: Grouped', 'Class :: C3 :: Componentised',' Config :: Any ',' Context :: Preserve', 'DBD :: SQLite',' Data :: Dumper :: Concise', 'Data :: Page',' MRO :: Compat', 'Module :: Find',' Package: : Stash', 'Path :: Class',' SQL :: Abstract', 'Scope :: Guard',' Sub :: Name', 'Test :: Deep',' Try :: Tiny' и 'namespace :: clean'. Я уверен, что будет работать простое приложение «DBI». – Borodin

 Смежные вопросы

  • Нет связанных вопросов^_^