2010-02-19 33 views
11

Tôi có kết nối JDBC MySQL trong Java. Chương trình của tôi hoạt động tốt để thực hiện truy vấn đơn giản.MySQLNonTransientConnectionException trong chương trình JDBC tại thời gian chạy

Nếu tôi chạy chương trình tương tự cho hơn 10 giờ và thực hiện một truy vấn sau đó tôi nhận được ngoại lệ MySQL sau:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
Connection.close() has already been called. Invalid operation in 
this state. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
    Native Method) 
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
    No operations allowed after statement closed. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
    Native Method) 

tôi đã không sử dụng phương pháp close() bất cứ nơi nào. Tôi tạo ra kết nối cơ sở dữ liệu và mở nó mãi mãi và luôn luôn thực hiện truy vấn. Không có nơi nào tôi đã đề cập rõ ràng thời gian chờ kết nối. Tôi không thể xác định được vấn đề.

Đây là mã tôi sử dụng cho các kết nối cơ sở dữ liệu:

String driver = PropertyReader.getDriver(); 
String url = dbURLPath; 
Class.forName(driver); 
connectToServerDB = DriverManager.getConnection(url); 
connectToServerDB.setAutoCommit(false); 

gì gây ra ngoại lệ đó?

Trả lời

5

Bạn phải thực hiện thay đổi trong tệp cấu hình hoặc tăng khoảng thời gian chờ của cơ sở dữ liệu. Nếu cơ sở dữ liệu không hoạt động trong hơn 8 giờ, nó sẽ bị đóng theo mặc định.

Cảm ơn

23

MySQL chấm dứt kết nối sau 8 giờ hết giờ. Bạn có thể sửa đổi thời gian chờ bằng cách đặt biến số wait_timeout trong MySQL.

Tuy nhiên, nói chung, không phải là một ý tưởng hay cho một ứng dụng giữ kết nối trong một thời gian dài như vậy. Cách tiếp cận tốt hơn là thiết lập nhóm kết nối bằng cách sử dụng API gộp chung như Apache DBCP và truy xuất kết nối từ nhóm thay vì trực tiếp mặc dù trình điều khiển. Một hồ bơi kết nối cũng sẽ chăm sóc về việc thiết lập lại một kết nối gộp nếu nó chết vì một lý do nào đó, bao gồm cả thời gian chờ.

2

Tôi cũng gặp phải vấn đề tương tự. Đó là vì thời gian chờ kết nối bởi mysql và nói chung nó không phải là một thực hành tốt để mở rộng thời gian chờ trong mysql vì nó phục vụ cho nhiều ứng dụng khác. Thật tốt khi kết nối lại cơ sở dữ liệu khi hết thời gian chờ (tức là khi ngoại lệ này xảy ra) hoặc sử dụng một số thư viện nguồn mở để kết nối tổng hợp như Apache DBCP như @slava đề xuất. Theo mặc định, khung ORM sẽ xử lý điều này. Chúc mừng !!

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