2011-11-22 82 views
3

我有一個運行在WAS 7.0上的web應用程序,它可以正常工作幾個星期,而且沒有問題。突然間,它會在試圖針對MS SQL 2005執行PreparedStatement時開始拋出SocketExceptions。首先,我們開始着眼於一些顯而易見的問題,這些問題可能會導致無法關閉連接,重新引導服務器,連接池大小等。但是沒有任何東西出現。我們在池中嘗試了WAS的連接重試,但這並不起作用。與服務器重新啓動沒有一致的關聯。JDBC連接拋出SocketException

我們正在運行WAS 7,並且該應用程序正在使用JSF 1.2。這是跟蹤堆棧跟蹤的受影響代碼。

try { 
    conn = DBManager.getInstance().getInpatientConnection(); 

    String sql = "select * from Reviews where datediff(y,reviewedDate,getDate()) < 30"; 
    ps = conn.prepareStatement(sql); 
    rs = ps.executeQuery(); 

    while(rs.next()){ 
     reviewed.add(rs.getString("authNum")); 
    } 
} catch (SQLException e) { 
    e.printStackTrace(); 
} finally{ 
    DBManager.clean(conn, rs, ps); 
} 

跟蹤...

0000002a SystemErr  R Caused by: java.lang.ClassCastException: java.net.SocketException incompatible with java.sql.SQLException 
0000002a SystemErr  R at com.microsoft.sqlserver.jdbc.SQLServerPooledConnection.notifyEvent(Unknown Source) 
0000002a SystemErr  R at com.microsoft.sqlserver.jdbc.SQLServerConnection.notifyPooledConnection(Unknown Source) 
0000002a SystemErr  R at com.microsoft.sqlserver.jdbc.DBComms.transmit(Unknown Source) 
0000002a SystemErr  R at com.microsoft.sqlserver.jdbc.IOBuffer.sendCommand(Unknown Source) 
0000002a SystemErr  R at com.microsoft.sqlserver.jdbc.SQLServerStatement.sendExecute(Unknown Source) 
0000002a SystemErr  R at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteQuery(Unknown Source) 
0000002a SystemErr  R at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(Unknown Source) 
0000002a SystemErr  R at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.pmiExecuteQuery(WSJdbcPreparedStatement.java:1099) 
0000002a SystemErr  R at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeQuery(WSJdbcPreparedStatement.java:720) 
0000002a SystemErr  R at com.bcbst.ipct.controllers.MemberListingController.initReviews(MemberListingController.java:266) 
0000002a SystemErr  R at com.bcbst.ipct.controllers.MemberListingController.<init>(MemberListingController.java:251) 
0000002a SystemErr  R at java.lang.J9VMInternals.newInstanceImpl(Native Method) 
0000002a SystemErr  R at java.lang.Class.newInstance(Class.java:1345) 
0000002a SystemErr  R at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:190) 
0000002a SystemErr  R ... 66 more 

我不知道提供什麼其他信息。讓我知道任何其他信息,你認爲我的相關知道。我谷歌搜索了這麼多,沒有什麼用處了。

TIA

+0

爲了獲得有關SocketException的更多信息,您應該爲SocketException放置一個特定的catch並打印該堆棧跟蹤,然後再次拋出SocketException。您正在運行代碼的環境並未顯示您的SocketException所具有的所有信息,因爲它試圖將其轉換爲SQLException(它不是其子類)。 –

+0

因爲executeQuery()沒有明確地拋出一個SocketException,所以catch被認爲是無法訪問的代碼,所以爲SocketException放置一個catch就不會編譯。我能做的就是捕捉一個異常並打印該堆棧跟蹤。 – dharga

+1

它看起來像你有一個連接中的錯誤。是「DBManager.getInstance()。getInpatientConnection();」的結果一個對象,它是第三方類的一個實例? – belgther

回答

1

從您的堆棧跟蹤看,它看起來像是MSSQL JDBC驅動程序中的一個錯誤。如果在數據庫脫機時引發異常,您只需捕獲ClassCastException即可。此外,它也可能是Java版本問題,因爲JDBC驅動程序依賴於某個「類層次結構」。