2012-07-02 47 views
13

Tôi có một ứng dụng web với một nền tảng Java sử dụng Tomcat jdbc-pool cho các kết nối cơ sở dữ liệu. Điều này hoạt động tốt. Tuy nhiên tôi đang cố gắng để đánh lừa nó trước khi xuất khẩu nó đến các địa điểm khác, và gần đây một kịch bản xảy ra khi ai đó khởi động lại dịch vụ cơ sở dữ liệu SQL Server nhưng không khởi động lại dịch vụ Tomcat. Điều này gây ra một SQLException: java.sql.SQLException: I/O Error: Connection reset by peer: socket write error cho đến khi tôi khởi động lại Tomcat, buộc nguồn dữ liệu pool jdbc phải kết nối lại.cố gắng kết nối lại nguồn dữ liệu pool jdbc sau khi khởi động lại cơ sở dữ liệu

Tôi đã tìm một loại cấu hình nào đó trong tài liệu jdbc của Tomcat để báo cho nguồn dữ liệu cố gắng kết nối lại nhưng tôi không thể tìm thấy bất kỳ thứ gì.

Có ai biết nếu có một số loại cấu hình cho điều này hoặc tôi có nên kiểm tra điều kiện này trước mỗi yêu cầu không?

Trả lời

15

Không chắc chắn 100% nếu đây là vấn đề của bạn nhưng trên http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency nó nói bạn có thể sử dụng testOnBorrow với validationQuery.

<Resource type="javax.sql.DataSource" 
      ... 
      testOnBorrow="true" 
      validationQuery="SELECT 1" 
      removeAbandoned="true" 
      /> 
+3

Tôi đã cố gắng để tránh những phí truy vấn xác nhận, và tìm thấy một phương pháp khác trong cùng liên kết sử dụng 'timeBetweenEvictionRunsMillis = "5000"' và 'minEvictableIdleTimeMillis = "5000"' và 'minIdle = "0" 'có vẻ như để xử lý vấn đề, cảm ơn. – Geronimo

0

Khi kiểm tra cùng một vấn đề, tôi đã xem qua bài đăng này có cấu hình kết nối tự động cho tất cả máy chủ ứng dụng.

Dưới đây là cấu hình mà tôi đã sử dụng để tự động kết nối trong tomcat để tham khảo.

<Resource auth="Container" 
driverClassName="oracle.jdbc.OracleDriver" 
initialSize="5" 
maxActive="120" 
maxIdle="5" 
maxWait="5000" 
name="jdbc/oracle/myds" 
password="secret" 
poolPreparedStatements="true" 
type="javax.sql.DataSource" 
url="jdbc:oracle:thin:@DBHOSTNAME:1521/ServiceName" 
username="testuser" 
validationQuery="select 1 from tab" 
testOnBorrow="true"/> 

Cấu hình kết nối tự động hoàn chỉnh cho tất cả máy chủ ứng dụng có thể tìm thấy tại đây Datasource autoreconnect in Java Application Servers.

0

Chỉ cần thêm vào câu trả lời Natan Cox của

Reference - http://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#Common_Attributes

<Resource type="javax.sql.DataSource" 
     ... 
     testOnBorrow="true" 
     validationQuery="SELECT 1" 
     removeAbandoned="true" 
     /> 

Như chống Geronimo, tôi vẫn muốn sử dụng validationQuery

Cơ sở dữ liệu validationQuery lưu ý

hsqldb - select 1 from INFORMATION_SCHEMA.SYSTEM_USERS

Oracle - select 1 from dual

DB2 - select 1 from sysibm.sysdummy1

mysql - select 1

microsoft SQL Server - select 1

postgresql - select 1

Ingres - select 1

derby - values 1

H2 - select 1

Firebird-select 1 from rdb$database

Reference - DBCP - validationQuery for different Databases

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