6

Có thể sử dụng một người nào đó giải thích cách phối hợp kết nối chuẩn bị chính xác bằng cách sử dụng dbcp không? (với một số mã ví dụ nếu có thể). Tôi đã tìm ra cách để bật nó - truyền KeyedObjectPoolFactory đến PoolableConnectionFactory. Nhưng làm thế nào các báo cáo chuẩn bị cụ thể được xác định sau đó? Ngay bây giờ tôi chỉ sử dụng PoolingDataSource để nhận các kết nối từ nhóm. Làm thế nào để tôi sử dụng các báo cáo chuẩn bị từ hồ bơi?Sử dụng phối hợp PreparedStatement trong dbcp

+0

Bạn đang chuyển cho KeyedObjectPoolFactory? Phương thức khởi tạo cho GenericKeyedObjectPoolFactory yêu cầu một KeyedPoolableObjectFactory và tôi không thấy cách tạo một trong những cái sẽ sử dụng Connection the PreparedStatement. –

Trả lời

6

Cũng nói về việc kết nối từ hồ bơi với kết nối "không được gộp", bạn có bất kỳ thay đổi nào trong mã của mình không :)? Tôi đặt cược bạn không. Cùng một cách với báo cáo chuẩn bị. Mã của bạn không nên thay đổi. Vì vậy, không có ví dụ mã hữu ích cho việc này.

Bạn nên đọc tài liệu để triển khai Nguồn dữ liệu JDBC của bạn và xem những gì các nhà phát triển phải nói về tổng hợp. Không có nguồn thông tin đáng tin cậy nào khác về điều này.

Từ here: Thành phần này cũng có khả năng để lập nhóm PreparedStatements. Khi kích hoạt một hồ bơi tuyên bố sẽ được tạo ra cho mỗi kết nối và PreparedStatements tạo ra bởi một trong những phương pháp sau đây sẽ được gộp lại:

* public PreparedStatement prepareStatement(String sql) 
* public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) 

Vì vậy, bạn chỉ cần tiếp tục sử dụng prepareStatement() gọi và DBCP của bạn sẽ về mặt lý thuyết chăm sóc gộp (tức là nếu bạn đang cố tạo "chọn * từ người dùng u nơi u.name như: id", nó sẽ cố gắng tìm câu lệnh này trong hồ bơi trước)

+0

Thật sao? Vậy tại sao PoolableConnectionFactory lại có tham số cho việc gộp nhóm? Rõ ràng phải có một số cách để thiết lập nó. Apache - như thường lệ - không giúp được gì. – sproketboy

+0

@Dan: Bạn có muốn mở rộng nhận xét của mình không? Phần nào trong câu trả lời của tôi mà bạn không đồng ý? Nếu bạn đọc lại câu hỏi, tác giả _already knows_ cách bật tính năng tổng hợp cho các câu lệnh. Anh ta đang tự hỏi về những thay đổi mà anh ta cần phải thực hiện trong mã, nếu có. –

+1

Xin lỗi là chỉ có tính cáu kỉnh do thiếu tài liệu thông thường tại Apache. – sproketboy

1

Đây là mã cơ bản tôi sử dụng.

GenericObjectPool connectionPool = new GenericObjectPool(null); 
    connectionPool.setMinEvictableIdleTimeMillis(1000 * 60 * 30); 
    connectionPool.setTimeBetweenEvictionRunsMillis(1000 * 60 * 30); 
    connectionPool.setNumTestsPerEvictionRun(3); 
    connectionPool.setTestOnBorrow(true); 
    connectionPool.setTestWhileIdle(false); 
    connectionPool.setTestOnReturn(false); 

    props = new Properties(); 
    props.put("user", username); 
    props.put("password", password); 
    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, props); 

    PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, "SELECT 1", false, true); 
    PoolingDataSource dataSource = new PoolingDataSource(connectionPool); 
+2

Điều này không thể đúng. Việc bỏ qua null cho đối số thứ ba của PoolableConnectionFactory sẽ vô hiệu hóa bộ đệm ẩn PreparedStatement, theo http://commons.apache.org/dbcp/apidocs/org/apache/commons/dbcp/PoolableConnectionFactory.html#PoolableConnectionFactory(org.apache.commons.dbcp. ConnectionFactory, org.apache.commons.pool.ObjectPool, org.apache.commons.pool.KeyedObjectPoolFactory, java.lang.String, boolean, boolean). Điều gì nên được sử dụng cho đối số đó? –

0

Vấn đề là nếu bạn sử dụng một đơn Connection, nó sẽ lưu PreparedStatement s cho dù bạn muốn điều này hay không, cách duy nhất có thể ảnh hưởng về vấn đề này là sử dụng DataSource tài sản hoặc sử dụng nhà cung cấp cụ API. Nhưng những câu lệnh này không được hiển thị bởi các kết nối khác và nếu bạn chuẩn bị cùng một câu lệnh bằng cách sử dụng một kết nối khác, nó sẽ tái tạo lại nó. Vì vậy, các nhóm kết nối như DBCP dưới mui xe cho phép tái sử dụng các kết nối khác nhau của PreparedStatement (nó sử dụng giao diện PooledConnection thay vì đơn giản Connection), chúng theo dõi tất cả các câu lệnh được chuẩn bị bởi tất cả các kết nối.

CẬP NHẬT: có vẻ như tôi đã sai về thông tin này, ít nhất tôi không thể tìm thấy chức năng này trong C3P0.

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