我有一个大约有5,000,000行的MySQL表,通过DBI连接的并行Perl进程以小的方式不断更新.该表有大约10列和几个索引.
一个相当常见的操作有时会产生以下错误:
DBD::mysql::st execute failed: Deadlock found when trying to get lock; try restarting transaction at Db.pm line 276.
Run Code Online (Sandbox Code Playgroud)
触发错误的SQL语句是这样的:
UPDATE file_table SET a_lock = 'process-1234' WHERE param1 = 'X' AND param2 = 'Y' AND param3 = 'Z' LIMIT 47
Run Code Online (Sandbox Code Playgroud)
该错误仅在有时触发.我估计只有1%或更少的电话.然而,它从未发生在一个小桌子上,随着数据库的增长而变得越来越普遍.
请注意,我正在使用file_table中的a_lock字段来确保我运行的四个几乎相同的进程不会尝试在同一行上工作.该限制旨在将他们的工作分解成小块.
我没有在MySQL或DBD :: mysql上做太多调整.MySQL是标准的Solaris部署,数据库连接设置如下:
my $dsn = "DBI:mysql:database=" . $DbConfig::database . ";host=${DbConfig::hostname};port=${DbConfig::port}";
my $dbh = DBI->connect($dsn, $DbConfig::username, $DbConfig::password, { RaiseError => 1, AutoCommit => 1 }) or die $DBI::errstr;
Run Code Online (Sandbox Code Playgroud)
我在网上看到其他几个人报告了类似的错误,这可能是一个真正的僵局.
我有两个问题:
究竟是什么情况导致上述错误?
有一种简单的方法来解决它或减少它的频率?例如,我究竟如何"在Db.pm第276行重新启动交易"?
提前致谢.
我多年来一直在使用带有-ne
选项的Perl命令行,主要用于处理sed不能的方式的文本文件.例:
cat in.txt | perl -ne "s/abc/def/; s/fgh/hij/; print;" > out.txt
Run Code Online (Sandbox Code Playgroud)
我不知道我在哪里学到了这一点,并且今天只读了perlrun并发现还有其他形式(perl -pe
例如).
我还应该知道什么perl -ne
?
我将编写一个应用程序,对从RESTful Web服务获取的数据进行一些计算,并输出到文本文件和/或HTML页面.Web服务是基于HTTP的XML.我用LWP :: Simple和XML :: Simple做了一个简单的概念验证,但它有点特别.
任何人都可以通过这种方式推荐一些Perl模块或最佳实践来与RESTful Web服务进行交互吗?是否有一个模块可以处理我的所有细节(发出请求+处理响应),或者问题域是否过于笼统?
请注意,Web服务是基于HTTP的XML,但我希望最终必须使用HTTP GET,POST和HEAD.我想如果它变得更简单,我可以选择请求JSON而不是XML.
提前致谢.
我有一个程序必须从PHP脚本中读取配置文件,快速搜索显示有很多方法可以处理Perl中的配置文件:
Brian 在这里提供了一个概述.
Config :: Simple对我有用,因为现有文件类似于INI.我有兴趣知道人们经常在他们的代码中使用什么样的风格?
我如何知道Perl分发了哪些模块?
我的第一个猜测是这里列出的核心模块总是包含在内,但我无法明确地说明这一点.但是,我已经使用了这个集合之外的模块(例如LWP),而无需在Mac OS X和Linux上安装它们.
所以要稍微改进我的问题:
并且:我如何找出已分发的模块:
Linux(尤其是Debian/Ubuntu)?
Mac OS X?
的Solaris?
在每种情况下,我使用的是最新版操作系统标准的Perl版本.
TIA.
更新:问题的原因是我在Mac OS X和Linux上开发用于部署到不同的Linux和Solaris,我没有root用于某些系统,而在Mac OS XI的情况下则没有甚至有一个编译器AFAIK.所以我想知道在没有进一步安装的情况下我在所有四个部署中可用的模块.
Perl 定义的函数(以及许多其他函数)返回"布尔值".
鉴于Perl实际上没有布尔类型(并且使用值为1表示true,0或undef表示false)Perl语言是否准确指定了布尔值的返回值?例如,会defined(undef)
返回0或undef,是否会发生变化?
我有一个这种形式的片段:
my $a = $some_href->{$code}{'A'}; # a number or undef
my $b = $some_href->{$code}{'B'}; # a number or undef
$a = 0 unless defined($a);
$b = 0 unless defined($b);
my $total = $a + $b;
Run Code Online (Sandbox Code Playgroud)
由于涉及两个以上的变量,现实更加混乱.
我真正想写的是:
my $total = $some_href->{$code}{'A'} + $some_href->{$code}{'B'};
Run Code Online (Sandbox Code Playgroud)
并且undef正确评估为0,但几乎每次运行都会收到这些警告:
Use of uninitialized value in addition (+) at Stats.pm line 192.
Run Code Online (Sandbox Code Playgroud)
让这些消息消失的最佳方法是什么?
注意:如果相关,我会使用严格的'和'使用警告'.
我继承了一个已有20年历史的交互式命令行unix应用程序,该应用程序不再受其供应商的支持.我们需要在此应用程序中自动执行某些任务.
其中最麻烦的是创建数千个具有略微不同参数的新记录(例如,不同的标识符,不同的名称).记录必须按顺序创建,一次一个,这需要花费许多个月(因此美元)来手动完成.在大多数情况下,创建记录具有非常可预测的键入命令,读取响应,键入其他命令等模式.但是,某些记录创建操作将导致错误条件("具有此标识符的记录已存在")一组不同的命令,可以优雅地退出.
我可以看到几种不同的方法来做到这一点:
命名管道.编写运行目标应用程序的Perl脚本,并将STDIN和STDOUT设置为命名管道,然后向目标应用程序发送命令序列以创建具有所需参数的记录,然后指示目标应用程序退出和关闭.然后,我们根据需要使用不同的参数多次运行脚本.
应用.找到另一个可用于编写交互式程序脚本的Unix工具.我能找到的唯一的东西是期待的,但这似乎不是最好的维持; 和聊天,我记得很久以前,它似乎做了或多或少我想要的,但似乎只是控制调制解调器.
还有一个潜在的复杂问题:我认为目标应用程序是为VT100终端编写的,它使用某种转义序列来执行提供突出显示等功能.
我的问题是我应该采取什么方法?其中之一,还是完全不同的东西?我非常喜欢使用命名管道,然后使用Perl脚本打开FIFO并根据需要进行读写,因为它提供了很大的灵活性,但从我所看到的情况来看,似乎存在很多潜在的问题,如果我走这条路.
提前致谢.
看起来这应该是显而易见的,但如何使用Expect.pm将箭头按键发送到进程?它取决于我使用的终端类型(vt100)还是我发送键盘扫描码?
TIA.
CPAN中有许多不同的Cache实现.我正在使用Cache :: File(因为它安装在我的操作系统上),但我也看到了对File :: Cache,Cache:FileCache,Cache :: Cache等的引用.许多似乎是"缓存接口"的实现,它似乎是模块"Cache"或"Cache :: Cache".
谷歌搜索正确的文档很困难.任何人都可以解释不同的Cache实现(重点是文件缓存)以及为什么有这么多?
奖励点告诉我实际上要发现的内容:Cache :: File中的到期时间值的语法是什么?我只看过一些像600或'600秒'的例子,但没有解释完整的语法.
谢谢.
更新:我想我已经找到了答案,我的奖金问题在这里.