2013-05-07 44 views
7

Tham chiếu đến Tomcat JBDC connection pool, tôi thấy trong ví dụ java độc lập được cung cấp ở đó, một kết nối được sử dụng datasource.getConnection() thật thú vị. Nhưng trong khối cuối cùng, nó nói con.close().Hồ bơi kết nối JDBC Tomcat (phát hành kết nối)

Câu hỏi: Khi tôi triển khai điều này, có vẻ như rõ ràng rằng số con tôi nhận được từ nguồn dữ liệu sẽ bị đóng mọi lúc trong lần cuối cùng. Khi điều này được đóng lại, cơ chế tổng hợp kết nối sẽ có được một kết nối mới và thêm nó vào hồ bơi?

Tôi giả sử có một cuộc gọi phương thức như releaseConnection() để cho hồ bơi tự quyết định có nên đóng cửa hay để nó mở cho một số mục đích sử dụng khác.

Tôi cũng đã thử làm điều này ConnectionPool aPool = datasource.createPool(); Nhưng tôi thấy không có kết nối phát hành nào giống như trên aPool này.

Tôi nghĩ tôi đang thiếu thứ gì đó ở đây? Đánh giá cao sự giúp đỡ của bạn.

đoạn mã từ Tomcat JBDC connection pool:

  DataSource datasource = new DataSource(); 
      datasource.setPoolProperties(p); 

      Connection con = null; 
      try { 
       con = datasource.getConnection(); 
       Statement st = con.createStatement(); 
       ResultSet rs = st.executeQuery("select * from user"); 
       int cnt = 1; 
       while (rs.next()) { 
        System.out.println((cnt++)+". Host:" +rs.getString("Host")+ 
        " User:"+rs.getString("User")+" Password:"+rs.getString("Password")); 
       } 
       rs.close(); 
       st.close(); 
      } finally { 
       if (con!=null) try {con.close();}catch (Exception ignore) {} 
      } 

Trả lời

7

Vì bạn gọi phương thức close() trên phương thức thu được bên hồ bơi, tùy vào hồ bơi cần làm gì bên trong cuộc gọi phương thức này. Nó không nhất thiết phải đóng kết nối cơ sở dữ liệu gộp - nó có thể làm một số dọn dẹp và sau đó thêm connetion trở lại hồ bơi.

này đã được trả lời trong Closing JDBC Connections in Pool

+0

Giữ cài đặt "MaxIdle" của DataSource đủ cao để nhận các kết nối đó không bị đóng. Đặt nó thành 0 sẽ tắt mọi kết nối đã đóng, tôi đoán vậy. – Hartmut

2

Đó dụ chỉ cho thấy how to create and use a data source. Đối với hồ bơi kết nối trên Tomcat, bạn có thể cấu hình JNDI.

// Sample 
public static Connection getConnectionFromPool() { 
    Context initCtx = new InitialContext(); 
    Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
    DataSource ds = (DataSource) envCtx.lookup("jdbc/TestDB"); 
    return ds.getConnection(); 
    ... 

Trích từ How connection pooling works in Java and JDBC:

Một hồ bơi kết nối hoạt động bằng cách thực hiện công việc của tạo kết nối trước thời hạn, Trong trường hợp của một hồ bơi kết nối JDBC, hồ bơi của các đối tượng kết nối được tạo ra tại thời điểm ứng dụng máy chủ (hoặc một số máy chủ khác) bắt đầu. Những đối tượng này sau đó được quản lý bởi một người quản lý hồ bơi phân tán các kết nối khi họ được yêu cầu bởi khách hàng và trả lại chúng vào hồ bơi khi xác định khách hàng là kết thúc với đối tượng Kết nối. Rất nhiều dịch vụ dọn phòng là liên quan đến việc quản lý các kết nối này.

Khi máy chủ nhóm kết nối bắt đầu, nó sẽ tạo một số đối tượng kết nối được xác định trước . Sau đó ứng dụng khách sẽ thực hiện tra cứu JNDI để truy xuất tham chiếu đến đối tượng DataSource mà triển khai giao diện ConnectionPoolDataSource. Ứng dụng của khách hàng sẽ không cần thực hiện bất kỳ điều khoản đặc biệt nào để sử dụng nguồn dữ liệu được gộp chung ; mã sẽ không khác với mã được viết cho Nguồn dữ liệu không được chia sẻ.

3

OK, xấu của tôi, mà tôi không thấy thi hành DataSource. Nó mở rộng DataSourceProxy rằng trong nội bộ tạo ra một hồ trước khi trở về một Connection dựa trên PoolProperties

tôi hiểu, nó tối đa DataSource này để xử lý các kết nối, mặc dù tôi đóng con ở cuối cùng, DataSource có thể có hành động cần thiết.

Thêm nhận xét/trả lời nếu có ai đó nghĩ khác.

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