2012-10-24 12 views
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(和相關的信息(我在代碼中保留我的密碼以純文本形式傳遞,這是不好的))有沒有直接與我的網站進行交互的安全好處?

回答

3

在腳本中創建此$ dbh是否通過保持 數據庫連接打開來提高性能?

我可以把$ dbh放在我的模塊中,而不是害怕被低效嗎?

通常,您想要最小化數據庫連接打開的時間長度。同時打開大量連接會損害性能。持續打開連接的時間越長,當許多人同時使用您的網站時,您將累積的連接越多。

另一方面,多次斷開和重新連接也會影響性能。

如果您希望網站流量很大,最好的解決方案是實現連接池。這可以使許多活動連接保持開放並可用,但不會將它們綁定到特定用戶。 Here is a discussion of MySQL connection pooling with Perl。如果以這種方式實現它,那麼您希望儘可能以最短的時間打開一個連接。這將是有效的,因爲它不是一個「真正的」敞篷之下 - 只是一個已經打開的連接的分配。

是否有安全利益保持$胸徑(以及相關 信息(我把我在代碼明文通;是壞的)?)的 模塊不直接與互動中通過我的網站?

如果模塊位於非Web可訪問的文件夾中,這可能會帶來一些好處。不過,真的,你不應該用純文本存儲密碼。Here is a discussion of some other options.

+0

優秀!感謝您的參考。我將繼續探討這些問題。 – Dylan

0

您可以在模塊中創建靜態變量,或全程走OO並創建內部初始化$dbh和保持它活着模塊對象。這樣做對性能沒有影響。

至於與外部數據的交互 - 您的模塊只是打包代碼的另一種方式,所以它很可能(或不太可能)被用作主代碼。您應該依靠其他預防措施(例如使用污染模式)。