現在我們有一個使用原始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
現在我們有一個使用原始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
我沒有與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;
}
只是確保:你知道DBI->connect_cached()
,對不對?這是connect()
的一個替代品,可以在可能的情況下在您的perl腳本的生命週期中重用dbh。也許你的問題可以通過添加7個字符來解決:)
而且,MySQL的連接相對便宜。在您的數據庫中運行max_connections=1000
或更高版本本身不會造成問題。 (如果你的客戶要求更多的工作比你的數據庫可以處理,這是一個更嚴重的問題,一個較低的max_connections
可能推遲,但當然不解決。)
我認爲免費版的MySql只支持200個連接嗎? – bonez 2010-09-02 13:58:12
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
沒有「付費」版本的MySQL。這都是GPL。最好的情況是,Oracle可能會有一個支持合同,您可以付錢,但軟件本身是完全免費的,並且沒有任何錯誤。 – 2016-04-25 21:41:24
我使用DBIx ::連接器(什麼DBIx :: Class在內部使用),這真是太好了......如果連接參數完全相同,我將這些連接與一個Moose對象包裝器集中在一起,以回傳現有的對象實例。推出自己的產品並不難。 – Ether 2010-07-16 18:58:23
@Ether - 值得一個答案,恕我直言 – DVK 2010-07-16 20:37:07
@DVK:好的,我在這個問題上擴展了一個答案... – Ether 2010-07-16 20:51:11