2014-02-10 4 views
2

Я использую DBI Perl для доступа postgreSQL, и я заметил, что когда у меня есть несколько параллельных процессов, которые готовят один и тот же запрос, они, похоже, получают одинаковое имя подготовленного оператора на сервере, создавая конфликт.perl DBI и конфликты готового имени оператора

2014-02-10 10:04:11.802650500 DBD::Pg::st execute failed: ERROR: prepared statement "dbdpg_p20307_185" already exists at /usr/sbin/mslrest.pl line 207. 
2014-02-10 10:04:11.804659500 [Mon Feb 10 10:04:11 2014] [error] DBD::Pg::st execute failed: ERROR: prepared statement "dbdpg_p20307_185" already exists at /usr/sbin/mslrest.pl line 207. 

Есть ли способ передать имя подготовленного заявления, чтобы я мог его рандомизировать и избежать этого конфликта?

+1

Интересно, может ли это быть вызвано использованием копии того же dbh (из-за forking) в двух процессах. Ты? – ikegami

+0

Не уверен, я использую Mojolicious :: Lite и Hypnotoad. Вероятно, это вилка. Я мог бы попробовать снова подключиться, чтобы гарантировать, что dbh не используется ... –

+0

Да, я думаю, что так оно и есть. В качестве быстрого теста я снова подключился к каждому запросу, и проблема не появляется. Теперь я могу внести правильное решение. Спасибо! –

ответ

2

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

0

Для моего Мохолического приложения я использую общий экземпляр DBIx::Connector.

Всякий раз, когда мне нужно подключение к базе данных, я спрашиваю экземпляр соединителя для одного. Разъемы и вилки обрабатываются автоматически.

0

Никогда не передавайте дескрипторы DB в подпроцессы. Создайте дескриптор в подпроцессе, и вы должны быть в порядке.

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