2014-02-10 63 views
2

我使用Perl的DBI進行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(由於分叉)的副本造成的。你是? – ikegami

+0

不確定,我正在使用Mojolicious :: Lite和Hypnotoad。它可能會分叉。我可以嘗試重新連接,以確保dbh不共享... –

+0

是的,我認爲就是這樣。作爲快速測試,我重新連接了每個請求,並且不會出現問題。現在我可以採取適當的解決方案。謝謝! –

回答

2

該過程的分叉導致每個工人具有相同的dbh。確保每一個都是唯一的問題。

0

對於我的Mojolicious應用程序,我使用了一個共享實例 DBIx::Connector

每當我需要一個數據庫連接,我要求連接器實例一個。斷開和叉子自動處理。

0

不要將DB句柄傳遞給子進程。在子進程中創建句柄,你應該沒問題。