2016-07-29 109 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编写的遗留系统。 –