2010-07-16 50 views
11

Ngay bây giờ, chúng tôi có một ứng dụng perl lớn đang sử dụng DBI thô để kết nối với MySQL và thực thi các câu lệnh SQL. Nó tạo ra một kết nối mỗi lần và kết thúc. Đã bắt đầu tiếp cận giới hạn kết nối của mysql (200 cùng một lúc)Kết nối Perl Kết nối

Có vẻ như DBIx::Connection hỗ trợ ghép nối lớp ứng dụng.

Có ai có bất kỳ trải nghiệm nào với DBIx::Connection không? Có cân nhắc nào khác về kết nối tổng hợp không?

Tôi cũng thấy mod_dbd là một mod Apache có vẻ như nó xử lý kết nối tổng hợp. http://httpd.apache.org/docs/2.1/mod/mod_dbd.html

+1

Tôi sử dụng DBIx :: Connector (DBIx :: Class sử dụng nội bộ) và nó tuyệt vời ... Tôi gộp các kết nối này với một trình bao bọc đối tượng Moose để đưa các cá thể đối tượng hiện có trở lại nếu các tham số kết nối giống hệt nhau. Nó không khó để cuộn của riêng bạn. – Ether

+1

@Ether - đáng để trả lời, IMHO – DVK

+0

@DVK: ok, tôi đã mở rộng câu trả lời này ... – Ether

Trả lời

8

tôi không có bất kỳ kinh nghiệm với DBIx :: Kết nối, nhưng tôi sử dụng DBIx::Connector (thực chất là gì DBIx :: Class sử dụng trong nội bộ, nhưng inlined) và rất tuyệt vời ...

tôi hồ bơi những kết nối này với một wrapper đối tượng Moose mà trao lại trường hợp đối tượng hiện tại nếu các thông số kết nối là giống hệt nhau (điều này sẽ làm việc tương tự cho bất kỳ đối tượng DB cơ bản):

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

bạn có thể vui lòng chia sẻ toàn bộ mã cũng vui lòng cung cấp giải pháp để đạt được với Rose :: DB handler – Sethu

+0

@Sethu đó là toàn bộ mã. và tôi sẽ không khuyên bạn nên sử dụng Rose :: DB trong mọi trường hợp. – Ether

+0

là hàm get_connection_info được xác định trước? nếu không vui lòng chia sẻ chức năng đó quá. – Sethu

5

Chỉ cần đảm bảo: bạn có biết về DBI->connect_cached(), phải không? Đó là một thay thế thả cho connect() mà reuses dbh của, nếu có thể, trong suốt cuộc đời của kịch bản perl của bạn. Có thể sự cố của bạn có thể giải quyết được bằng cách thêm 7 ký tự :)

Và các kết nối của MySQL tương đối rẻ. Chạy với DB của bạn tại max_connections=1000 hoặc nhiều hơn sẽ không tự gây ra vấn đề. (Nếu khách hàng của bạn đang yêu cầu nhiều công việc hơn DB của bạn có thể xử lý, đó là một vấn đề nghiêm trọng hơn, một trong đó thấp hơn max_connections có thể đưa ra nhưng tất nhiên không giải quyết.)

+0

Tôi nghĩ rằng phiên bản miễn phí của MySql chỉ hỗ trợ 200 kết nối phải không? – bonez

+1

Phiên bản miễn phí của MySQL không bị tê liệt theo bất kỳ cách nào. (Trừ khi bạn đếm GPL, haha.) Ngay cả các ứng dụng lớn và kém được viết không cần nhiều hơn một vài nghìn, nhưng bạn có thể đặt [max_connections] (http://dev.mysql.com/doc/refman/5.0 /en/server-system-variables.html#sysvar_max_connections) cao như bạn muốn, nếu bạn có bộ nhớ và mô tả tập tin. –

+2

Không có phiên bản "trả tiền" của MySQL. Đó là tất cả GPL. Tốt nhất, Oracle có thể có một hợp đồng hỗ trợ mà bạn có thể trả tiền, nhưng bản thân phần mềm hoàn toàn miễn phí và không bị quấy rầy. –

Các vấn đề liên quan