2013-04-26 174 views
2

有人可以給我一些方向,當在不同的.pm文件中的「對象」之間共享一個$ dbh變量時,最好的辦法是做什麼。Perl模塊 - 共享數據庫連接

例如,我的主要模塊說Foo.pm有一個新的構造函數等,我可以給它一個dbh或創建一個dbh然後通過將它作爲參數傳遞給Bar.pm的新構造函數來共享它,然後在Bar-> new中重新賦值,但是好像我在管理這個變量時做了很多工作。

這是一個簡單但優雅的方式來做到這一點?我研究過出口商和其他一些例子,但沒有一個看起來很直接。

謝謝!

+2

重新設計你的模塊。您應該只有*一個*寫入數據庫。 – Borodin 2013-04-26 23:39:30

+2

考慮DBIx ::連接器。您的主應用程序可以實例化一個連接器對象,並可以將其提供給應用程序使用的類。連接器對象可以共享連接,或者在現有連接器對象死亡時旋轉一個新連接。這是我在完整Mojolicious應用程序中處理數據庫交互的方式之一。 – DavidO 2013-04-27 03:23:24

+1

嘗試Singleton模式。你可以編寫你自己的或者從CPAN嘗試一個Singleton基類。 – 2013-04-27 07:22:01

回答

-1

如果您使用Moose來構建您的對象,可以將數據庫句柄封裝在role中,並將它請求到需要訪問數據庫的類中。

2

我想你實際上想要的是將對$ dbh創建的控制從與它一起工作的代碼中取出。最平凡的方式是,好,

my $dbh; 
sub get_dbh { 
    if ($dbh is bad) { 
     reconnect or whatever 
    } 

    return $dbh || die; 
} 

然後在你的代碼訪問它像

get_dbh()->do("your sql"); 

你可以把那個get_dbh()功能到一個單獨的模塊,並從項目中的任何地方調用它 - 像往常一樣使用perl,它將只包含一次,其本地靜態變量$ dbh將只存在於perl進程中的一個副本中。

有許多可能的方法來實現這一點,寫一個像上面描述的函數(也許傳遞一個引用,而不是傳遞$ dbh)是一個。還有很多其他的,取決於你的設計和個人品味 - 單身類,與上述功能相關的變量,甚至是模仿DBI的類......這取決於你,但應該是一個一塊的代碼,在你的項目中散佈這個邏輯是一個壞主意。