2009-06-02 12 views
9

Dựa trên câu trả lời tôi nhận được here, tôi bắt đầu cung cấp cho commons-pool một cái nhìn nghiêm trọng. Trải nghiệm cuối cùng của tôi về việc sử dụng nó vào khoảng năm 2003, có lẽ là phiên bản 1.1 hoặc 1.2. Người dùng chính của nó, DBCP, được nhiều người coi là thiếu sót và cần tránh.Lời khuyên cho việc sử dụng commons-pool trong sản xuất

Có ai sử dụng hồ bơi commons trong sản xuất để viết hồ bơi của riêng bạn không? Loại hồ bơi tốt nhất để sử dụng là gì? Tôi dự định lưu trữ ứng dụng khách ổ cắm TCP trong đó.

Có hồ bơi chung khác thay thế không?

+0

Đó là lần đầu tiên tôi nghe nói về DBCP bị thiếu sót ... bạn có điều gì cụ thể hơn không? – skaffman

+0

@skaffman - hầu hết là mất kết nối không có lý do –

+0

Điều này thật thú vị: http://static.springsource.com/projects/tc-server/6.0/admin/radmjdbc.html ... đề cập đến sự thiếu sót của DBCP. Mặc dù vậy, không có nhiều trợ giúp vì nó là nguồn đóng. – skaffman

Trả lời

7

Có ai sử dụng hồ bơi commons trong sản xuất để viết hồ bơi của riêng bạn không?

Có, tôi làm và hồ bơi chứa các kết nối TCP, như bạn dự định. Nó có dây lên qua mùa xuân, vì vậy giả sử bạn hiểu cấu hình Spring:

<bean class="com.company.ConnectionSupplier"> 
<constructor-arg> 
    <!-- The ConnectionSupplier wraps an object pool --> 
    <bean class="org.apache.commons.pool.impl.GenericObjectPool"> 
    <constructor-arg> 
     <!-- The ObjectPool uses a ConnectionFactory to build new connections --> 
     <bean class="com.company.ConnectionFactory"> 
     <constructor-arg value="server" /> 
     <constructor-arg value="3000" /> 
     </bean> 
    </constructor-arg> 
    <property name="maxActive" value="20" /> 
    <property name="testOnBorrow" value="true" /> 
    </bean> 
</constructor-arg> 
</bean> 

Các ConnectionFactory kéo dài BasePoolableObjectFactory và là một wrapper nhỏ xung quanh một SocketFactory.

@Lời bình luận đầu tiên: Trình xây dựng ConnectionFactory có một máy chủ và một cổng. Trong hàm makeObject(), nó tạo ra các ổ cắm kết nối với máy chủ và cổng đó. Nó trả về các đối tượng 'Connection' bao bọc socket được tạo ra với một số phương thức thuận tiện để giao tiếp thông qua socket.

Kết nối được kiểm tra bằng cách sử dụng loại 'ping' hoặc 'echo' được cung cấp bởi giao thức được sử dụng để giao tiếp qua socket. Nếu điều đó không có sẵn, việc xác nhận/kiểm tra kết nối là không thực sự có thể, ngoại trừ việc yêu cầu ổ cắm cho dù nó đã được đóng chưa. Trong trường hợp đó, một kết nối trong hồ bơi sẽ bị vô hiệu nếu nó ném một ngoại lệ và mọi phương pháp sử dụng kết nối phải được chuẩn bị cho loại lỗi đó và cố gắng thực hiện cùng một kết nối khác.

+0

Bạn đã triển khai nhà máy kết nối như thế nào? Làm thế nào để bạn kiểm tra kết nối để được sống? –

0

Kiểm tra MultiThreadedHttpConnectionManager - đó là trình quản lý hồ bơi kết nối Apache Commons HttpClient có thể sẽ phù hợp với nhu cầu của bạn ngay tức thì.

+1

Như tôi đã viết, tôi cần nhóm chứa các cổng TCP, chứ không phải các kết nối HTTP. –

0

Trước tiên không sử dụng commons-pool 1.3, nó có một số vấn đề lớn với các ứng dụng đa luồng.

Thứ hai, Java 5 gói tương tranh có triển khai hồ bơi phong nha (xem mẫu here)

+0

Có phải c3p0 cho phép bạn sử dụng nhóm của nó mà không có công cụ JDBC không? –

+0

Tôi đã sửa chữa, loại bỏ c3p0, nhưng nhận xét 1,3 commons-pool của tôi là vô giá, nó đã cho tôi lứa tuổi để tìm thấy nó trong sản xuất. hiệu suất tăng lên sau khi nâng cấp lên 1.4 ... –

+3

Chúng tôi đang sử dụng 1,5 ... Java 5 thực sự có một chủ đề * đẹp * Hồ bơi nhưng chúng tôi đang tìm kiếm một * Object * Pool –

1

Bạn nên kiểm tra xem các chi phí instantation hơn hoặc quyến rũ từ hồ bơi. Bởi vì tình huống hợp lệ duy nhất để sử dụng hồ bơi là trường hợp đầu tiên.

+0

Tôi không thể khởi tạo các đối tượng mới, như các đối tượng là khách hàng Các ổ cắm TCP cần phải sống càng lâu càng tốt. Các kết nối đóng và mở được coi là tấn công DOS. –

+0

FYI: chúng tôi đang sử dụng GenericObjectPool của commons-pool ở một khu vực khác nhưng nó hoạt động rất tốt. –

1

Bạn đã xem xét Netty hoặc Apache MINA? Cả hai đều sẽ theo dõi các kết nối TCP của bạn và nên thực hiện bất kỳ giao thức truyền thông nào mà các socket TCP cũng sẽ dễ sử dụng hơn.

+0

Theo như tôi biết chúng được sử dụng để triển khai máy chủ, không phải máy khách. Tôi có thể sử dụng chúng để triển khai CLIENT tcp pools không? –

+1

Có. Cả Netty và MINA đều cho phép bạn viết một ứng dụng khách. – trustin