2009-12-08 42 views
7

Tôi đã thiết lập tomcat để sử dụng một hồ bơi kết nối nhưng sau khi hết thời gian mysql trên các kết nối trước đó mở trong hồ bơi không được mở.Here là tập tin context.xml của tôi trông như thế nào:Hồ bơi kết nối JDBC không mở lại Các kết nối trong tomcat

<Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource" 
      maxActive="5" maxIdle="3" maxWait="10000" 
      username="uname" password="password" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/> 

Như bạn có thể thấy tôi đã bao gồm tự động kết nối là đúng nhưng chưa. Tôi đã kiểm tra quá trình trên cơ sở dữ liệu sau 8 giờ đó là những gì thời gian ra được thiết lập để. Nếu ai đó có thể giúp tôi, hãy giúp tôi vì điều này đã là một vấn đề trong một vài tháng nhưng lại bị xáo trộn vì phần mềm của tôi sẽ sớm ra mắt.
Cảm ơn bạn đã nâng cao Dean Chester

Trả lời

6

Thử thêm thuộc tính truy vấn xác thực. Điều này sẽ có tác dụng tự động đóng và mở lại kết nối sau khi hết thời gian chờ như sau:

validationQuery="SELECT 1" 
+0

Tôi nhận giải pháp này trên một diễn đàn khác và đã thực hiện điều này. – Dean

+0

validationQuery là không đủ. Vui lòng đọc: http://leakfromjavaheap.blogspot.com/2013/11/robust-db-connection-pool-configuration.html –

+0

thuộc tính 'testWhileIdle' và' test-on-vay' sẽ sử dụng validationQuery –

1

Vì đây là trường hợp khẩn cấp và cho sản xuất, tôi khuyên bạn nên xem hồ bơi kết nối phong nha như c3p0. Nó mạnh mẽ hơn và đáng tin cậy hơn và có thể xử lý thời gian chờ tốt hơn.

5

Trước tiên, hãy loại bỏ thuộc tính autoReconnect. Bạn không cần điều này với một hồ bơi kết nối và có thể gây ra vấn đề.

Thứ hai, đảm bảo rằng bạn gần mọi nguồn lực (Connection, StatementResultSet) trong mã JDBC của bạn trong khối finally.

Tôi không chắc chắn nếu điều này áp dụng trong trường hợp của bạn, nhưng một quan niệm sai lầm phổ biến giữa những người mới bắt đầu là họ dường như nghĩ rằng bạn không cần phải đóng các tài nguyên đó trong trường hợp kết nối gộp. Điều này là không đúng sự thật. Một kết nối gộp là một wrapper (trang trí) xung quanh một kết nối trong đó có một chút thay đổi close() phương pháp mà đại khái giống như

public void close() throws SQLException { 
    if (this.connection is still active) { 
     do not close this.connection, but just return it to pool for reuse; 
    } else { 
     actually invoke this.connection.close(); 
    } 
} 

Với Nói cách khác, đóng chúng giải phóng lập kết nối gộp để nó có thể được đưa trở lại trong hồ bơi để tái sử dụng trong tương lai. Nếu bạn có được kết nối mà không đóng chúng, thì hồ bơi sẽ sớm hết kết nối.

0

Với cấu hình của bạn, bạn không nên tạo một kết nối khác nếu nó không hoạt động. Hãy thử thêm

minIdle="3" 

Với cài đặt này, DBCP sẽ duy trì 3 kết nối mọi lúc.

Chúng tôi thấy chính xác hành vi tương tự với một trong các máy chủ được sử dụng nhẹ. Do thời gian chờ kết nối mặc định là 8 giờ, chúng tôi không thấy kết nối nào khi chúng tôi đến vào buổi sáng. Đó là những gì chúng tôi mong đợi. Tuy nhiên, đôi khi chúng ta thấy kết nối cũ và yêu cầu đầu tiên sẽ không thành công. Để giải quyết vấn đề này, bạn cần thêm các thuộc tính sau,

testWhileIdle="true", 
timeBetweenEvictionRunsMillis="60000" 
Các vấn đề liên quan