1

所以我有一个cgi脚本,

#!/usr/bin/perl -T

use strict;
use warnings;
use DBI;
use WebEngine;


my $dbh = DBI->connect('DBI:mysql:database', $username, $password)
    || die "Could not connect to database: $DBI::errstr";

my $we = WebEngine->new($dbh)
    or die("Failed to instantiate WebEngine object:\n$!\n");

$userID = $we->register("MyUsername", $dbh);

这个脚本创建了一个数据库处理程序,然后使用我制作的一个模块来处理站点的大部分后端来注册用户名并返回一个用户 ID 号。

我对此有三个问题。

  • 在此脚本中创建此 $dbh 是否会通过保持数据库连接打开来提高性能?

  • 我可以将 $dbh 放在我的模块中而不用担心效率低下吗?

  • 在不通过我的网站直接交互的模块中保留 $dbh(以及相关信息(我在代码中以纯文本形式保存我的通行证;那很糟糕吗?))是否有安全优势?

4

2 回答 2

3

在此脚本中创建此 $dbh 是否会通过保持数据库连接打开来提高性能?

我可以将 $dbh 放在我的模块中而不用担心效率低下吗?

通常,您希望最小化数据库连接打开的时间长度。同时打开大量连接会损害性能。您保持连接打开的时间越长,当很多人同时使用您的网站时,您积累的连接就越多。

另一方面,多次断开和重新连接也可能会损害性能。

如果您预计站点上的流量很大,最好的解决方案是实施连接池。这使许多活动连接保持打开和可用,但不会将它们绑定到特定用户。 这是关于使用 Perl 进行 MySQL 连接池的讨论。如果您以这种方式实现它,那么您可能希望在最短的时间内打开连接。这将是有效的,因为它不是引擎盖下的“真正”打开 - 只是一个已经打开的连接的分配。

在不通过我的网站直接交互的模块中保留 $dbh(以及相关信息(我在代码中以纯文本形式保存我的通行证;那很糟糕吗?))是否有安全优势?

如果模块位于不可通过 Web 访问的文件夹中,那可能会有一点好处。但是,实际上,您不应该以纯文本形式存储密码。 这是对其他一些选项的讨论。

于 2012-10-24T07:33:55.783 回答
0

您可以在模块中创建静态变量,或者完全面向对象并创建在$dbh内部初始化并使其保持活动状态的模块对象。这样做不会对性能产生影响。

至于与外部数据的交互——您的模块只是打包代码的另一种方式,因此它与您的主代码一样可能(或不太可能)被利用。您应该依靠其他预防措施(例如使用污染模式)。

于 2012-10-24T07:26:50.530 回答