小编sen*_*nel的帖子

AutoCommit设置为0的DBI数据库句柄没有用SELECT返回正确的数据?

这是一个难以解释的(并且非常奇怪),所以请耐心等待.我将解释这个问题,并解决它,但我想看看是否有人可以解释为什么它的工作方式:)

我有一个使用mod_perl的Web应用程序.它使用MySQL数据库,我定期将数据写入数据库.它是模块化的,因此它也有自己的"数据库"类型的模块,我处理连接,更新等.database :: db_connect()子例程用于连接数据库,并AutoCommit设置为0.

我创建了另一个Perl应用程序(独立守护程序),它定期从数据库中提取数据,并根据返回的数据执行各种任务.我在其中包含了database.pm模块,所以我不必重写/复制所有内容.

我遇到的问题是:

应用程序在启动时连接到数据库,然后永远循环,每隔X秒从数据库中获取数据.但是,如果数据库中的数据被更新,我的应用程序仍然会返回"旧"数据,这是我对数据库的初始连接/查询.

例如 - 我有3行,"Name"列的值为'a','b'和'c' - 用于每条记录.如果我更新其中一行(例如,从命令行使用mysql客户端)并将名称从"c"更改为"x",我的独立守护程序将无法获取该数据 - 它仍然会返回/ b/c MySQL的.我用tcpdump捕获了数据库流量,我肯定可以看到MySQL确实正在返回那些数据.我也尝试过将SQL_NO_CACHE与SELECT一起使用(因为我不知道发生了什么),但这也无济于事.

然后,我修改了我的独立守护进程中的数据库连接字符串,并设置AutoCommit为1.突然,应用程序开始获取正确的数据.

我很困惑,因为我认为AutoCommit只影响INSERT/UPDATE类型的语句,并且对SELECT语句没有影响.但它看起来确实如此,我不明白为什么.

有没有人知道为什么SELECT语句在AutoCommit设置为0 时不会从数据库返回'updated'行,为什么在AutoCommit设置为1 时它会返回更新的行?

这是我在独立守护程序中使用的简化(取出错误检查等)代码,并且不返回更新的行.

#!/usr/bin/perl

use strict;
use warnings;
use DBI;
use Data::Dumper;
$|=1;

my $dsn = "dbi:mysql:database=mp;mysql_read_default_file=/etc/mysql/database.cnf";
my $dbh = DBI->connect($dsn, undef, undef, {RaiseError => 0, AutoCommit => 0});
$dbh->{mysql_enable_utf8} = 1;

while(1)
{
    my $sql = "SELECT * FROM queue";
    my $stb = $dbh->prepare($sql);
    my $ret_hashref = $dbh->selectall_hashref($sql, "ID");
    print Dumper($ret_hashref);
    sleep(30); …
Run Code Online (Sandbox Code Playgroud)

mysql perl select autocommit dbi

11
推荐指数
1
解决办法
5668
查看次数

XML ::复杂哈希的简单输出元素顺序

关于设置返回的XML元素的顺序,我已经在各个地方看到了很少的答案XMLout.但是,我无法使用这些答案/示例解决问题.

我有一个需要输出一些XML数据的脚本,某些元素需要按特定顺序打印.哈希是相当复杂的,我是不是能够通过覆盖达到任何结果sorted_keysXML::Simple对象.嗯,我做了,但不是我想要的方式.

示例代码如下,问题的详细信息在代码下方.

#!/usr/bin/perl

use strict;
use warnings;
use XML::Simple;

package MyXMLSimple;
use base 'XML::Simple';

sub sorted_keys
{
 my ($self, $name, $hashref) = @_;
 # ... 
 return $self->SUPER::sorted_keys($name, $hashref);
}

package main;

my $xmlParser = MyXMLSimple->new;

my $items = {
 'status' => 'OK',
 'fields' => {
  'i1' => {
   'header' => 'Header 1',
   'max_size' => '3'
  },
  'i2' => {
   'header' => 'Header 2',
   'max_size' => '8'
  }
 },
 'item_list' => {
  'GGG' => …
Run Code Online (Sandbox Code Playgroud)

xml sorting perl xml-simple

6
推荐指数
1
解决办法
2078
查看次数

如何确定Perl哈希是否是多维的?

假设我有这样的哈希:

$hash_ref = {

  'hashes' => {
    'h1' => { 'klf' => '1', 'moomooland' => '1' },
    'h2' => { 'klf' => '2', 'moomooland' => '2' },
    'h3' => { 'klf' => '3', 'moomooland' => '3' }
  },

  'keys' => {
    'k1' => 'key1',
    'k2' => 'key2',
    'k3' => 'key3'
  }

}
Run Code Online (Sandbox Code Playgroud)

我怎么能尽可能容易地找到包含3个键/值对的hashes3个哈希keys值?

ref将返回HASH他们两个,我不知道是否有可能找出这些哈希的深度.

谢谢 :)

perl hash

5
推荐指数
2
解决办法
946
查看次数

使用表示散列结构的字符串访问散列引用数据

假设我有一个复杂的哈希引用$ hash_ref,我想通过这样做来访问它中的数据:

my $string1 = "{books}";
my $string2 = "{31335}->{book_name}";
print Dumper($hash_ref->$string1->$string2);
Run Code Online (Sandbox Code Playgroud)

当然,这不起作用,但我希望它能解释我想做什么.

显然,我可以通过很多方式来完成这项工作,但我(出于好奇心)真的有兴趣弄清楚是否有一些Perl魔法可以使这个工作没有分裂字符串等.

我知道我可以创建3个字符串,("books", "31335", "book_name")并在一秒钟内完成,并且肯定有其他方法,但我从未理解是否可以通过使用表示散列结构的字符串实际访问散列数据,如上例所示.

谢谢 :)

perl hash

2
推荐指数
1
解决办法
572
查看次数

标签 统计

perl ×4

hash ×2

autocommit ×1

dbi ×1

mysql ×1

select ×1

sorting ×1

xml ×1

xml-simple ×1