Проблема с потоком Perl и MS SQL

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

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

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

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

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

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

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


person stepan    schedule 06.09.2016    source источник
comment
Прошу прощения, если туплю, но какое отношение DBI имеет к Win32::OLE? Я не вижу проблем с предоставлением многопоточного доступа к базе данных с помощью DBI.   -  person Borodin    schedule 06.09.2016
comment
Я думал, что библиотека Perl DBI использует в моем случае библиотеку Win32::OLE и поэтому не сохраняет соединение с базой данных по $con = DBI-›connect(dbi:ADO:...).   -  person stepan    schedule 06.09.2016
comment
Вам нужно будет использовать соединение ODBC с драйвером DBD::ODBC, но DBI не зависит ни от каких модулей, кроме некоторых требований времени сборки и DBD драйверов.   -  person Borodin    schedule 06.09.2016
comment
Я пробовал подключение ODBC, если я создаю новое подключение в каждом потоке perl, пока все работает без ошибок. Спасибо !   -  person stepan    schedule 06.09.2016
comment
Я рад, что это работает для вас. Вы должны принять к сведению предупреждение в моем ответе о том, что вы должны установить $dbh->{AutoInactiveDestroy} = 1 непосредственно после вызова connect для более безопасной многопоточной работы.   -  person Borodin    schedule 07.09.2016


Ответы (2)


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

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

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

person Borodin    schedule 06.09.2016