2009-07-06 59 views
11

Tôi đang chạy qua một vấn đề với kết nối Oracle gộp thông qua OracleConnectionCacheImpl. Khi tôi kết nối với một nhóm kết nối trên máy chủ cơ sở dữ liệu (Oracle 10g) thông qua trình điều khiển mỏng, mọi thứ hoạt động tốt cho đến sau một thời gian không xác định, kết nối db bị ngắt (có thể do kết nối không hoạt động?) Và tôi nhận được thông báo lỗi:Cách tự động kết nối lại hồ bơi kết nối Oracle sau khi ngắt kết nối?

Kết nối đã đóng.

Làm mới trang và kiểm tra lại kết nối sẽ kết nối lại cơ sở dữ liệu, do đó, có vẻ như đó không phải là vấn đề với mạng hoặc cơ sở dữ liệu. Là một cách cho các hồ bơi kết nối Oracle để xác nhận kết nối của nó và kết nối lại nếu kết nối trong hồ bơi là chết vì lý do nào?

Tôi đang sử dụng Apache Tomcat 6.0.18, Java EE6 cập nhật 11.

(Có vẻ là một chức năng ping trong trình điều khiển mỏng Oracle. Điều đó giúp đỡ và nơi tôi có thể tìm thấy nó?)

+2

1) Bạn có thể thêm toàn bộ stack trace cho đóng kết nối 2) Bạn đã thiết lập InactivityTimeout, TimeToLiveTimeout hoặc AbandonedConnectionTimeout với bất kỳ giá trị không phải mặc định? 3) Bạn có sử dụng ValidateConnection không? –

+0

4) Các kết nối vật lý giữa máy chủ ứng dụng và máy chủ DB bị cắt theo cấp độ mạng, ví dụ: bởi tường lửa? –

+0

Tôi đặt các thông số này ở đâu? Tôi mới để lập trình Oracle, vì vậy tôi không chắc chắn nơi để tìm các thông số này. Tôi có thể tìm ValidateConnection ở đâu và buộc kết nối lại? (Chỉ cần làm mới trình duyệt của tôi ngay sau khi tôi thấy lỗi sẽ khắc phục sự cố ngay lập tức. Tôi không chắc chắn đây có phải là vấn đề về tường lửa hay không.) – futureelite7

Trả lời

-1

Sử dụng thư viện nhóm kết nối khác, chẳng hạn như C3P0 và sử dụng tính năng này cho tự động reconnect.

0

Apache DBCP (nhóm kết nối DB) sẽ trợ giúp tại đây. Bạn có thể cấu hình với một tham số 'validationQuery', là một truy vấn SQL để chạy trên một kết nối được loại bỏ khỏi nhóm TRƯỚC KHI nó cung cấp cho bạn. Nếu truy vấn không thành công, kết nối sẽ bị hủy và kết nối mới được tạo và đưa cho bạn.

Xem tại đây http://commons.apache.org/proper/commons-dbcp/configuration.html để biết thêm chi tiết.

Lưu ý, validationQuery sẽ được gọi mỗi khi bạn nhận được kết nối từ nhóm, vì vậy nó cần phải nhanh nhất có thể. ví dụ:

SELECT id FROM users LIMIT 1; 
0

Bạn có thể thêm một số tham số cấu hình trong context.xml để hồ bơi kết nối tomcat sẽ xử lý các kết nối chết. Dưới đây là một ví dụ về context.xml, vui lòng sử dụng user/password/url/ports etc theo cài đặt của bạn.

<?xml version="1.0" encoding="UTF-8"?> 
<Context path=""> 
    <!-- Specify a JDBC data source --> 
    <Resource name="jdbc/db" auth="Container" 
       type="javax.sql.DataSource" 
       username="user" 
       password="password" 
       driverClassName="driver.class.fullpath" 
       url="jdbc:oracle://localhost:3306/ 
       maxActive="50" 
       maxIdle="10" 
       testOnBorrow="true" 
       testWhileIdle="true" 
       validationQuery="/* ping */" 
       removeAbandoned="true" 
       logAbandoned="true"/> 
</Context> 
Các vấn đề liên quan