免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3867 | 回复: 6
打印 上一主题 下一主题

做了个并行处理数据的perl,高手帮忙看看,有没问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-18 17:29 |只看该作者 |倒序浏览


  1. #!/usr/bin/perl

  2. use DBI;

  3. my $quit         = 2;

  4. $SIG{CHLD}   = sub {$quit++;while(waitpid(-1,WNOHANG)>0){}};
  5. $SIG{INT}      = sub {$quit++};

  6. my $dsn          = "DBI:mysql:database=cc_com;host=61.152.X.X:3306;user=web_mysql;password=shocom#7-06";
  7. my $sql           = "";
  8. my $sth           = "";

  9. while(1){
  10.         my @ret_value;
  11.         $dbh       = DBI->connect($dsn) || die "Database connection not made: $DBI::errstr";
  12.         $isselect = 0;
  13.         $i            = 0;
  14.         $sql        = "SELECT * FROM upload_temp";
  15.         $sth        = $dbh->prepare( $sql );

  16.         $sth->execute();


  17.         while($quit>0){
  18.                 if(@row = $sth->fetchrow_array){
  19.                         $quit--;
  20.                         $i++;
  21.                         defined($ret_value[$i] = fork()) or die "error!n";
  22.                         if($ret_value[$i] == 0){
  23.                                 format_conversion($row[1]);
  24.                                 exit 0;
  25.                         }
  26.                 }else{
  27.                         last;
  28.                 }

  29.         }
  30.         foreach my $ret (@ret_value){
  31.                 if(!defined($ret)){
  32.                         #print "not defined ret_value[0] next\n";
  33.                         next;
  34.                 }
  35.                 waitpid($ret,0);
  36.                 print "waitpid($ret 0)\n";
  37.         }
  38.         sleep(5);
  39. }

  40. $dbh->disconnect;
  41. exit 0;

  42. sub format_conversion
  43. {
  44.         my $file_path = shift;
  45.         print "$file_path\n";
  46.         #这里可以把数据库里的数据清除掉,做相关处理
  47.         sleep 10;
  48. }

复制代码


为什么每次while里都要$dbh       = DBI->connect一次吗,不能一直连接着吗??

论坛徽章:
0
2 [报告]
发表于 2007-06-19 10:34 |只看该作者
大家帮我看看吧,为什么

每次while里都要 $dbh       = DBI->connect 一次吗,不能一直连接着吗??

论坛徽章:
0
3 [报告]
发表于 2007-06-19 15:03 |只看该作者
In Perl you cannot make persistent connections to MySQL, unless you use mod_perl.

论坛徽章:
0
4 [报告]
发表于 2007-06-19 18:28 |只看该作者
In Perl you cannot make persistent connections to MySQL, unless you use mod_perl.


是mysql本身的限制么?我连oracle没出过什么问题的。

论坛徽章:
0
5 [报告]
发表于 2007-06-20 15:18 |只看该作者
mysql用PHP连是可以用persistent connections 的啊

现在我是想把
$dbh       = DBI->connect($dsn)放在while外面,,在while里头判断连接是否断掉,如果断了就再连一次

不知道有没有更好的办法啊

论坛徽章:
0
6 [报告]
发表于 2007-06-21 00:05 |只看该作者
应该有参数设置长连接短连接,你查查mysql函数的资料,一般默认都是短连接

论坛徽章:
0
7 [报告]
发表于 2007-06-21 16:17 |只看该作者

回复 1楼 honghec 的帖子

Hi,

put $dbh = DBI->... outside of while(1).
or
write subroutine that returns $dbh then call this sub first.
in the while loop to check $dbh, if $dbh is dead, call this sub again.

--ulmer
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP