减少数据库开放连接的选项?

时间:2011-10-24 21:26:26

标签: php perl database-connection

我有一个非常常用的免费应用程序,我不时会有大约500到1000个并发用户。

此应用程序是一个桌面应用程序,它将与我的网站API进行通信,每5到15分钟接收一次数据,并且每15分钟发回一次最少的3个选项。

由于用户可以根据需要打开和关闭应用程序,因此每个用户查询我的API的计时器可能会有所不同,因此我一直在达到我的托管计划可用的最大连接限制。

不想为了财务问题升级它以及因为它目前是一个非盈利的应用程序我正在寻找其他选项来减少连接数量并缓存一些可以缓存的信息。< /强>

我想到的第一件事就是在Perl上使用FastCGI我已经测试了一段时间了它看起来效果很好但我在使用它时遇到了问题:

  1. 如果由于某种原因,应用程序空闲60分钟 服务器将其终止,并且对于接下来的几个请求,它将回复 错误500,直到脚本重新生成,大约需要3分钟以上 (是的,我花了很多时间在我自己的测试中尝试了我的代码 服务器,它立即出现,所以我相信这是一个服务器问题 我的托管公司,但他们似乎不想解决 它)。

  2. kill timeout设置为300并将终止/重启 在那段时间之后的脚本将导致上述1) 关于剧本的重生。

  3. 鉴于我现在正在寻找不基于FastCGI的替代品,如果有的话。 另外由于共享主机的限制,我无法创建自己的守护进程,并且我对编译任何内容的访问权限非常有限。

    有什么好的选择我可以用Perl或PHP存档吗?

    主要是将数据库打开的连接减少到最小,并且仍然可以缓存一些选择的查询以返回数据......应用程序的主要过程是插入/更新数据,所以不需要缓存。

    这是我用来测试它的简单代码:

    #!/usr/bin/perl -w
    
    use CGI::Simple; # Can't use CGI as it doesn't clear the data for the 
                     # next request haven't investigate it further but needed 
                     # something working to test and using CGI::Simples was 
                     # the fastest solution found.
    use DBI;
    use strict;
    use warnings;
    
    use lib qw( /home/my_user/perl_modules/lib/perl/5.10.1 );
    use FCGI;
    
    my $dbh = DBI->connect('DBI:mysql:mydatabase:mymysqlservername',
                           'username', 'password', 
                           {RaiseError=>1,AutoCommit=>1}
                          ) || die &dbError($DBI::errstr);
    
    my $request = FCGI::Request();
    while($request->Accept() >= 0)
    {
        my $query   = new CGI::Simple;
        my $action  = $query->param("action");
        my $id      = $query->param("id");
        my $server  = $query->param("server");
        my $ip      = $ENV{'REMOTE_ADDR'};
    
        print $query->header();
    
        if ($action eq "exp")
        {
            my $sth = $dbh->prepare(qq{
                                INSERT INTO 
                                   my_data (id, server) VALUES (?,INET_ATON(?))
                                ON DUPLICATE KEY UPDATE
                                   server = INET_ATON(?)});
            my $result = $sth->execute($id, $server, $server)
                                 || die print($dbh->errstr);
            $sth->finish;
            if ($result)
            {
                print "1";
            }
            else
            {
                print "0";
            }
        }
        else
        {
            print "0";
        }
    }
    
    $dbh->disconnect || die print($DBI::errstr);
    exit(0);
    
    sub dbError
    {
        my ($txt_erro) = @_;
        my $query = new CGI::Simple;
        print $query->header();
        print "$txt_erro";
        exit(0);
    }
    

2 个答案:

答案 0 :(得分:1)

运行代理。 Perl的DBD :: Proxy应该符合要求。代理服务器不应该在主机的控制之下,因此它的60 - 不活动规则不适用于此。

或者,安装一个比FastCGI超时更频繁运行的cron作业,只需在您的站点上找到一些“make activity”页面,然后丢弃输出。例如,有些CRM这样做是为了强制“检查更新”,所以这并不完全不寻常,尽管这里有些烦人。

答案 1 :(得分:0)

FWIW,您可能想要查看CGI :: Fast而不是CGI :: Simple来解决您的CGI.pm没有使用持久变量处理预期的方式......