2009-09-10 26 views
7

tôi nhận được ngoại lệ sau đây vào những thời điểm:Java JDBC: Reply.fill()

com.ibm.db2.jcc.b.gm: [JCC] [t4] [2030] [11211] [ 3.50.152] Đã xảy ra lỗi giao tiếp trong các hoạt động trên ổ cắm cơ bản của kết nối, luồng đầu vào socket, hoặc luồng đầu ra ổ cắm. Vị trí lỗi: Reply.fill(). Tin nhắn: Đặt lại kết nối. ERRORCODE = -4499, SQLSTATE = 08001

Vấn đề là, mã thực hiện thành công trong một thời gian và sau đó đột nhiên tôi nhận ngoại lệ này. Tuy nhiên nó chạy perfrectly khi tôi chạy mã một lần nữa.

Có thể một số người vui lòng cho tôi biết điều gì có thể sai và cung cấp cho tôi một số gợi ý để giải quyết vấn đề này.

+0

Vui lòng tham khảo liên kết này http://www-01.ibm.com/support/docview.wss?uid=swg21962086 và http://www-01.ibm.com/support/docview.wss?uid = swg21600160 –

Trả lời

0

Dường như kết nối của bạn hết hạn. Tôi không thực sự là nơi mà vấn đề là mặc dù. Nó có thể là kết nối với máy chủ db của bạn. Tôi xin lỗi tôi không thể giúp bạn nhiều hơn, nhưng tôi hy vọng điều này sẽ giúp.

3

Đây là dấu hiệu không đóng/phát hành tài nguyên JDBC đúng cách. Bạn cần phải có được đóng tất cả tài nguyên JDBC trong phạm vi ngắn nhất có thể, tức là bạn cần đóng chúng theo thứ tự đảo ngược trong khối finally của khối try của khối phương thức rất giống như bạn đã mua chúng. Ví dụ.

Connection connection = null; 
Statement statement = null; 
ResultSet resultSet = null; 
try { 
    connection = database.getConnection(); 
    statement = connection.createStatement(); 
    resultSet = statement.executeQuery(SQL); 
    // ... 
} finally { 
    if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {} 
    if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} 
    if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} 
} 

Nếu bạn không đóng chúng sớm nhất có thể, DB sẽ sớm tự mình dùng ngay hoặc sau đó và ứng dụng của bạn có thể bị hỏng sớm hay muộn khi bạn gặp phải chính mình.

Để cải thiện hiệu suất kết nối, sử dụng hồ bơi kết nối - bạn vẫn cần phải thu thập và đóng chúng theo cách tương tự như ở trên đây! Nó bây giờ chỉ là việc thực hiện hồ bơi kết nối mà dưới mui xe lo lắng về việc thực sự đóng kết nối hay không.

+1

Hy vọng khối try-with-resources trong Java 7 sẽ giúp giảm bớt một số điều này trong tương lai. Mặc dù có một phần của tôi làm tôi bối rối về việc cho phép các nhà phát triển thoát khỏi việc không làm sạch tài nguyên. Tôi sợ nó có thể dẫn đến sự phát triển cẩu thả. Và sau đó điều gì xảy ra nếu những nhà phát triển đó phải làm việc trên mã 7 JRE trước? Chỉ cần suy nghĩ to đáp lại câu trả lời của bạn. Nhưng chắc chắn ++ trên câu trả lời. –

+1

@ Chris: chắc chắn ARM sẽ giúp đỡ rất nhiều trong việc giảm 'close()' -in-'finally' boilerplate. Tuy nhiên, bạn cũng có thể sử dụng JPA để làm giảm toàn bộ bản mẫu JDBC thành một oneliner. – BalusC

+1

Thú vị. Bạn có biết về bất kỳ bài viết nào về JPA và JDBC thuần túy không.Tôi đoán tôi đến từ kinh nghiệm mà các lớp trừu tượng đôi khi làm cho ứng dụng của chúng ta trở nên tồi tệ và khó khăn hơn để gỡ lỗi. Tôi thấy JDBC thuần túy khá đơn giản (ít nhất là khi làm việc với các chuỗi SQL thuần túy). Tôi có thể thấy nó sẽ hoạt động tốt hơn với các đối tượng ở đâu. Và nó xử lý các nguồn lực đóng cửa cho bạn? –

0

tôi dường như điều này có thể được gây ra bởi https://www-304.ibm.com/support/docview.wss?uid=swg1IC63952

Ít nhất đối với chúng tôi nó được.

Kiểm tra db2diag.log của bạn cho ZRC=0x8005006D=-2147155859=SQLE_CA_BUILT "SQLCA has been built and saved in component specific control block." thông báo lỗi khi bạn nhận được ngắt kết nối như vậy.

Cuối tuần này, chúng tôi dự định nâng cấp lên bản sửa lỗi DB2 9.7 FixPack 3a - sẽ viết lại nếu điều đó có ích.

1

chúng tôi gần đây cũng phải đối mặt với vấn đề này và đó là do các điều khoản AND HOẶC gây nhầm lẫn cùng với mệnh đề < và một điều khoản. Đặt niềng răng ở đúng nơi giải quyết nó.

+1

bài đăng này là một nhận xét, không phải là câu trả lời – Chani