2009-07-17 30 views
0

我在Java EE Web應用程序中調用以下方法。到SQL Server 2000的JDBC連接在Solaris服務器上隨機重置

public static void submitToPending() 
{ 
    Db db; 
    ResultSet rs; 

    try 
    { 
     db = new Db("Database.properties"); 

     rs = db.issueQuery(getDescriptorList()); 

     while (rs.next()) 
     { 
      db.insertApplicationData(rs.getString("Id")); 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     db = null; 
     rs = null; 
    } 
} 

這是代碼縮寫的片段我正在插入約40000新記錄到SQL Server 2000數據庫。此代碼是從生產中的Solaris 10服務器上承載的JSP執行的。今年之前,這個代碼只需要處理大約18,000條記錄,並且工作完美無瑕。今年有一些更新,爲了備件細節,現在可以處理大約40,000條記錄。

在開發過程中,我在我的Windows PC上從運行在Eclipse內部的Tomcat服務器上對生產中使用的同一數據庫(與記錄集不衝突)進行測試。一切工作正常,並且所有40,000條記錄都將其記錄到數據庫中。

當我安裝該網站到生產服務器並運行了一個測試,我注意到,在中途過程失敗,有以下例外消息:

com.microsoft.sqlserver.jdbc.SQLServerException:連接已關閉。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerStatement.checkClosed(Unknown Source ) 在com.microsoft.sqlserver.jdbc.SQLServerResultSet.checkClosed(未知來源) 在com.microsoft.sqlserver.jdbc.SQLServerResultSet.next(未知來源) 在(ClassNameOmittedToProtectTheInnocent.java:74)

SQL Server被設置爲無限制的同時連接,無限制超時。假設我的代碼在類Db沒問題(因爲它在Windows上工作,直到數據增加,在Solaris端一直表現良好),有什麼想法可以開始檢查?

我試圖跟蹤SQL Server以查看連接是否發生了一些事情,但即使在寫入堆棧跟蹤之後,它似乎仍然存在。

如果我可以提供任何其他信息,請讓我知道。我會盡我所能提供幫助。

回答

0

我懷疑你的數據庫和結果集引用設置爲null,但沒有關閉它們。我會明確地關閉這些(如果你有一個連接池,關閉一個連接並不會實際關閉它,但是會作爲一個信號將連接返回到池)。

我在猜測你正在運行一個資源限制,比如每個進程打開的文件描述符的最大數量,以及未能關閉結果集/連接將成爲這個問題的根源。

+0

即使這些調用是在finally塊嗎?這在db.insertApplicationData()方法調用失敗。 – karlgrz 2009-07-17 23:37:31