【问题标题】:Serialize and deserialize perl DBI connection object序列化和反序列化 perl DBI 连接对象
【发布时间】:2016-07-29 21:43:33
【问题描述】:

我需要用 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);

返回错误: 全局符号

"$drh" 需要明确的包名(你忘了声明“my $drh"?) 在 (eval 33) 第 6 行。

【问题讨论】:

  • 这听起来是个糟糕的主意。另外,您的其余代码在哪里?
  • 我的代码有 10 个包(类)。我的应用程序需要优化与数据库的号码连接。我的应用程序从一个与数据库的连接开始,它完成了 100 个分叉共享连接。如果一个子进程打开连接,它会与父进程和其他进程共享该连接。我做了同样的信号量来控制对连接的访问​​
  • 我可以发给你吗?
  • 这听起来像是对连接池的精心尝试。

标签: perl dbi storable


【解决方案1】:

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

【讨论】:

  • 所以当我共享连接后叉子打开?
  • @evertongava:fork 是一个克隆整个进程的系统调用。这包括所有用户空间和所有内核数据。所以它会首先工作。但是,如果您在多个进程的分叉之后使用相同的数据库句柄,它可能会停止工作,因为可能涉及的状态不会在这些进程之间共享。这可能在数据库驱动程序之间有所不同,但如果数据库连接是使用 TLS 完成的,则绝对正确。
  • 这个想法是有一个可以与数据库有 10-100 个连接的应用程序。我用 100 个信号量开始一个 semget,但只有一个连接。随着需求的增加,它会打开另一个连接并使用另一个信号量。如果需求减少并且连接空闲一分钟,它们就会关闭。该系统控制 300,000 辆汽车的车载计算机每分钟发送 3,000 条信息。但是一天中有时它需要更多的资源,有时它需要更少的资源。每辆车都有一个智能代理(进程)来跟踪它一段时间。这是一个用 perl 制作的遗留系统。
  • @evertongava:你拥有什么样的应用程序并不重要:数据库句柄的序列化仍然无法工作。如果您想知道如何在考虑到该限制的情况下设计应用程序,请提出一个不同的问题,并提供有关应用程序及其当前设计的更多详细信息。
猜你喜欢
  • 2016-10-14
  • 2014-12-24
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2020-02-24
  • 2020-05-03
相关资源
最近更新 更多