2016-07-29 83 views
0

我需要序列化一個數組與DBI連接對象與其他人共享使用共享內存的進程。但反序列化不起作用。序列化和反序列化perl DBI連接對象

使用可存儲的qw/freeze thaw /;

my @connections; 

for(my $c = 0;$c < 5;$c++) { 
    my $conn = DBI->connect($dsn,$user,$password,{'AutoCommit' => 1, 'RaiseError' => 1, 'PrintError' => 0}); 
    push(@connections,$conn); 
} 

my $shm = freeze(@connections); 
my $obj = thaw($shm); 

返回錯誤: 全局符號

"$drh" requires explicit package name (did you forget to declare "my $drh"?) at (eval 33) line 6.

+5

這聽起來像一個可怕的想法。另外,你的代碼的其餘部分在哪裏? – melpomene

+0

我的代碼有10個包(類)。我的應用程序需要優化與數據庫的數字連接我的應用程序從數據庫的一個連接開始,它共享了100個分支連接。如果一個孩子打開連接,它將與父母和其他進程共享連接。我做了相同的信號燈來控制對連接的訪問​​ –

+0

我可以發送給你嗎? –

回答

12

,因爲它包含不被可存儲(即Perl的外部和數據庫庫中,也許到達用戶空間的數據不能序列化數據庫處理器/連接也在TLS庫中)以及像文件描述符一樣的內核數據。

+0

因此,我分享連接後叉開放? –

+2

@evertongava:fork是一個克隆整個進程的系統調用。這包括所有用戶空間和所有內核數據。所以它會先工作。但是如果在多個進程的fork之後使用相同的數據庫句柄,它可能會停止工作,因爲可能有一個涉及的狀態不會在這些進程之間共享。這在數據庫驅動程序之間可能會有所不同,但如果使用TLS完成數據庫連接,則這肯定是正確的。 –

+0

這個想法是有一個應用程序可以有10-100與數據庫連接。我用100個信號啓動一個semget,但只有一個連接。隨着需求增加,它開啓另一個連接並使用另一個信號量。如果需求減少並且連接閒置一分鐘,則關閉。該系統控制30萬輛車載電腦的每分鐘3,000條消息。但是有一天它需要更多的資源和時間它資源更少。每輛車都有一個智能代理(過程),可以追蹤一段時間。這是一個用Perl編寫的遺留系統。 –