2010-07-16 236 views
11

現在我們有一個使用原始DBI連接到MySQL並執行SQL語句的大型perl應用程序。它每次創建一個連接並終止。開始接近mysql的連接限制(一次200)Perl連接池

看起來像DBIx::Connection支持應用程序層連接池。

有沒有人使用過DBIx::Connection?連接池是否還有其他注意事項?

我也看到mod_dbd這是一個Apache mod,它看起來像處理連接池。 http://httpd.apache.org/docs/2.1/mod/mod_dbd.html

+1

我使用DBIx ::連接器(什麼DBIx :: Class在內部使用),這真是太好了......如果連接參數完全相同,我將這些連接與一個Moose對象包裝器集中在一起,以回傳現有的對象實例。推出自己的產品並不難。 – Ether 2010-07-16 18:58:23

+1

@Ether - 值得一個答案,恕我直言 – DVK 2010-07-16 20:37:07

+0

@DVK:好的,我在這個問題上擴展了一個答案... – Ether 2010-07-16 20:51:11

回答

8

我沒有與DBIx ::連接任何經驗,但我用DBIx::Connector(基本上就是DBIx ::類內部使用,但內聯)和它的美妙......

我彙集這些連接與手背部現有的對象實例,如果連接參數是相同的一個木對象包裝(這將適用於任何底層數據庫對象相同):

package MyApp::Factory::DatabaseConnection; 
use strict; 
use warnings; 

use Moose; 

# table of database name -> connection objects 
has connection_pool => (
    is => 'ro', isa => 'HashRef[DBIx::Connector]', 
    traits => ['Hash'], 
    handles => { 
     has_pooled_connection => 'exists', 
     get_pooled_connection => 'get', 
     save_pooled_connection => 'set', 
    }, 
    default => sub { {} }, 
); 

sub get_connection 
{ 
    my ($self, %options) = @_; 

    # some application-specific parsing of %options here... 

    my $obj; 
    if ($options{reuse}) 
    { 
     # extract the last-allocated connection for this database and pass it 
     # back, if there is one. 
     $obj = $self->get_pooled_connection($options{database}); 
    } 

    if (not $obj or not $obj->connected) 
    { 
     # look up connection info based on requested database name 
     my ($dsn, $username, $password) = $self->get_connection_info($options{database}); 
     $obj = DBIx::Connector->new($dsn, $username, $password); 

     return unless $obj; 

     # Save this connection for later reuse, possibly replacing an earlier 
     # saved connection (this latest one has the highest chance of being in 
     # the same pid as a subsequent request). 
     $self->save_pooled_connection($options{database}, $obj) unless $options{nosave}; 
    } 

    return $obj; 
} 
+0

可以請你分享整個代碼,也請提供Rose :: DB處理器 – Sethu 2017-06-10 21:24:48

+0

@Sethu這個完整代碼的解決方案。在任何情況下我都不會推薦使用Rose :: DB。 – Ether 2017-06-11 21:57:50

+0

是get_connection_info預定義函數嗎?如果不善意分享該功能。 – Sethu 2017-06-12 08:44:21

5

只是確保:你知道DBI->connect_cached(),對不對?這是connect()的一個替代品,可以在可能的情況下在您的perl腳本的生命週期中重用dbh。也許你的問題可以通過添加7個字符來解決:)

而且,MySQL的連接相對便宜。在您的數據庫中運行max_connections=1000或更高版本本身不會造成問題。 (如果你的客戶要求更多的工作比你的數據庫可以處理,這是一個更嚴重的問題,一個較低的max_connections可能推遲,但當然不解決。)

+0

我認爲免費版的MySql只支持200個連接嗎? – bonez 2010-09-02 13:58:12

+1

MySQL的免費版本不會以任何方式癱瘓。 (除非你指望GPL,哈哈。)即使是大的和寫得不好的應用程序不應該超過幾千,但你可以設置[max_connections](http://dev.mysql.com/doc/refman/5.0 /en/server-system-variables.html#sysvar_max_connections)儘可能高,如果你有內存和文件描述符。 – 2010-09-06 13:23:41

+2

沒有「付費」版本的MySQL。這都是GPL。最好的情況是,Oracle可能會有一個支持合同,您可以付錢,但軟件本身是完全免費的,並且沒有任何錯誤。 – 2016-04-25 21:41:24