序列化和反序列化perl DBI连接对象

0 perl dbi storable

我需要使用DBI连接对象序列化一个数组,以使用共享内存与其他进程共享.但反序列化不起作用.

使用可存储的qw /冻融/;

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);
Run Code Online (Sandbox Code Playgroud)

返回错误:全局符号

"$ drh"需要明确的包名(您是否忘记在(eval 33)第6行声明"我的$ drh"?).

Ste*_*ich 12

您无法序列化数据库句柄/连接,因为它包含Storable无法访问的用户空间数据(即Perl外部和数据库库内部也可能在TLS库中)以及文件描述符等内核数据.

  • @evertongava:你有什么样的应用程序并不重要:数据库句柄的序列化仍然无效.如果您想知道如何设计具有该限制的应用程序,请提出另一个问题,了解有关应用程序及其当前设计的更多详细信息. (5认同)
  • @evertongava:fork是一个克隆整个进程的系统调用.这包括所有用户空间和所有内核数据.所以它会先工作.但是,如果在多个进程的fork之后使用相同的数据库句柄,它可能会停止工作,因为可能涉及的状态不会在这些进程之间共享.这可能在数据库驱动程序之间有所不同,但如果使用TLS完成数据库连接,则肯定是正确的. (2认同)