2009-03-20 65 views
30

Tôi đang sử dụng JDBC để kết nối với máy chủ MySQL (không có kết nối tổng hợp mà tôi nghĩ). Trong URL kết nối, tôi có autoReconnect=trueTại sao autoReconnect = true dường như không hoạt động?

Nhưng kết nối của tôi vẫn hết thời gian chờ. Tôi thậm chí đã kiểm tra conn.isClosed() và sai của nó. Nhưng khi tôi cố gắng sử dụng kết nối tôi nhận được ngoại lệ sau đây.

 
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.SocketException 
MESSAGE: Software caused connection abort: socket write error 

STACKTRACE: 

java.net.SocketException: Software caused connection abort: socket write error 
... 

Tôi biết trong Java 1.6, bạn có thể sử dụng conn.isValid(0) để kiểm tra kết nối, nhưng tôi đang sử dụng Java 1.5

Có cách nào để hoặc đảm bảo nó không thời gian ra? Hoặc tôi sẽ phải nâng cấp lên Java 1.6?

Trả lời

30

Tôi đã có cùng một vấn đề và nó đã hoàn toàn buồn. Đây là những gì các tài liệu nói trên trang web của MySQL (nhấn mạnh mỏ)

Nếu người lái xe cố gắng thiết lập lại các kết nối cũ và/hoặc đã chết? Nếu được bật, trình điều khiển sẽ ném ngoại lệ cho truy vấn được phát hành trên kết nối cũ hoặc cũ, thuộc về giao dịch hiện tại nhưng sẽ thử kết nối lại trước truy vấn tiếp theo được cấp trên kết nối trong giao dịch mới. Không nên sử dụng tính năng này, vì nó có tác dụng phụ liên quan đến trạng thái phiên và tính nhất quán của dữ liệu khi ứng dụng không xử lý SQLExceptions đúng cách và chỉ được thiết kế để sử dụng khi bạn không thể định cấu hình ứng dụng của mình để xử lý SQLExceptions do chết và kết nối cũ đúng cách. Ngoài ra, điều tra thiết lập biến máy chủ MySQL "wait_timeout" thành một số giá trị cao hơn là mặc định là 8 giờ.

Theo kinh nghiệm của tôi, có vẻ như chức năng "kết nối lại trên truy vấn tiếp theo" không hoạt động, nhưng tôi đang sử dụng MySQL 4.0, có thể là lý do cho điều đó.

Tôi đã kết thúc viết một khung nhỏ nắm bắt các ngoại lệ, kiểm tra lỗi cụ thể đó và thử kết nối lại và thử lại truy vấn nếu có thể.

ETA: This link cung cấp thêm một chút thông tin và cho biết rằng autoReconnect có thể sẽ bị xóa trong tương lai.

+3

Lời khuyên không sử dụng autoReconnect vì lời nhắc sẽ bị xóa trong tương lai là 8-10 tuổi. Tuy nhiên, tôi vẫn thấy MySQL 5.x cung cấp hướng dẫn cài đặt thuộc tính Connector/J autoReconnect là một tùy chọn để giải quyết vấn đề này ... –

+2

Từ tài liệu được liên kết: "Không có cách nào an toàn 100% mà trình điều khiển JDBC có thể tự động kết nối lại nếu kết nối TCP/IP chết mà không có nguy cơ tham nhũng của trạng thái cơ sở dữ liệu (ngay cả _with_ ngữ nghĩa giao dịch), đó là lý do tại sao tính năng này cuối cùng sẽ bị xóa. " –

2

autoReconnect vẫn ném ngoại lệ để bạn có thể chọn làm điều gì đó về tình huống nếu bạn muốn. Nếu bạn nắm bắt nó, bạn sẽ thấy rằng kết nối có một lần nữa sau đó. (Có một số phức tạp hơn nếu bạn đang ở trong một giao dịch - giao dịch hiện tại của bạn là khá nhiều người chết.)

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