2010-03-01 34 views
12

Tôi muốn sử dụng các kết nối được gộp chung với Java (vì sẽ tốn kém khi tạo một kết nối cho mỗi chuỗi) vì vậy tôi đang sử dụng đối tượng MysqlConnectionPoolDataSource(). Tôi kiên trì nguồn dữ liệu của mình trên các chủ đề. Vì vậy, tôi chỉ sử dụng một nguồn dữ liệu trong suốt ứng dụng như thế này:Tôi có sử dụng Java PooledConnections chính xác không?

startRegistry(); // creates an RMI registry for MySQL 
    MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource(); 
    dataSource.setUser("username"); 
    dataSource.setPassword("password"); 
    dataSource.setServerName("serverIP"); 
    dataSource.setPort(3306); 
    dataSource.setDatabaseName("dbname"); 

    InitialContext context = createContext(); // Creates a context 
    context.rebind("MySQLDS", dataSource); 

Bây giờ tôi đã nguồn dữ liệu của tôi tạo ra, tôi đang làm như sau trong từng chủ đề riêng biệt:

PooledConnection connect = dataSource.getPooledConnection(); 
    Connection sqlConnection = connect.getConnection(); 

    Statement state = sqlConnection.createStatement(); 

    ResultSet result = state.executeQuery("select * from someTable"); 
    // Continue processing results 

Tôi đoán những gì tôi đang bối rối là cuộc gọi tới dataSource.getPooledConnection();
Điều này có thực sự tìm nạp kết nối được gộp lại không? Và chuỗi này có an toàn không? Tôi nhận thấy rằng PooledConnection có các phương thức như thông báo() và wait() ... có nghĩa là tôi không nghĩ rằng nó đang làm những gì tôi nghĩ rằng nó đang làm ...

Ngoài ra, khi nào và làm thế nào tôi nên phát hành kết nối?

Tôi tự hỏi liệu sẽ có ích hơn khi cuộn của riêng mình vì sau đó tôi sẽ quen thuộc hơn với mọi thứ, nhưng tôi thực sự không muốn phát minh lại bánh xe trong trường hợp này :).

Cảm ơn SO

+0

Tất cả các lớp Java đều thông báo và chờ, vì chúng được kế thừa từ java.lang.Object. Nó là rất hiếm để thực sự sử dụng chúng, mặc dù. –

+0

Vâng tôi là một chút mới với java lol ... Tôi cho nó một whirl – Polaris878

+0

Đây là một ví dụ từ Apache DBCP: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/ doc/PoolingDataSourceExample.java?view = co –

Trả lời

15

Đây không phải là cách phù hợp. Nguồn dữ liệu cần được quản lý bởi bất kỳ vùng chứa nào bạn đang chạy ứng dụng. MysqlConnectionPoolDataSourcekhông phải hồ bơi kết nối. Nó chỉ là một thực hiện cụ thể của giao diện javax.sql.DataSource. Bạn thường định nghĩa nó trong ngữ cảnh JNDI và lấy nó từ đó. Ngoài ra MySQL chính nó nói rõ ràng tất cả trong their documentation.

Bây giờ, cách sử dụng tùy thuộc vào mục đích của ứng dụng. Nếu nó là một ứng dụng web, thì bạn cần tham khảo tài liệu tài nguyên JNDI của servletcontainer/appserver đang được đề cập đến. Nếu nó là ví dụ Tomcat, sau đó bạn có thể tìm thấy nó here. Nếu bạn đang chạy một ứng dụng khách - tôi sẽ đánh giá cao giá trị của một pool kết nối--, sau đó bạn cần tìm một khung kết nối tổng hợp có thể sử dụng nguồn dữ liệu được kết hợp do MySQL cung cấp, chẳng hạn như C3P0.

Các vấn đề khác với mã mà bạn đăng là PooledConnection#getConnection() sẽ trả lại kết nối cơ bản mà do đó không là một kết nối gộp. Gọi điện thoại gần nó sẽ không trả lại kết nối với hồ bơi, nhưng thực sự đóng nó lại. Các hồ bơi đã tạo ra một kết nối mới mọi lúc.

Sau đó, câu chuyện về an toàn chủ đề, phụ thuộc vào khung cấu hình kết nối thực sự thực sự được đề cập. C3P0 đã chứng minh mạnh mẽ của nó trong năm, bạn đừng lo lắng về điều đó miễn là bạn viết mã JDBC theo thành ngữ tiêu chuẩn, tức là sử dụng chỉ các giao diện JDBC và có được đóng tất cả các nguồn lực (Connection, StatementResultSet) trong phạm vi ngắn nhất có thể.

+0

Ứng dụng độc lập RESTlet của nó ... do đó không có máy chủ ứng dụng hoặc JNDI – Polaris878

+0

Sau đó sử dụng C3P0. – BalusC

+0

C3P0 là khá lớn cho một cái gì đó mà có thể phù hợp trong một tập tin lớp nếu bạn sử dụng PooledConnection cho nhiệm vụ. – Trejkaz

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