2011-11-22 21 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の特定のキャッチを配置し、そのスタックトレースを出力してからSocketExceptionを再度スローする必要があります。コードを実行している環境では、SocketExceptionが持つSQLException(サブクラスではない)にキャストしようとしているため、SocketExceptionのすべての情報が表示されません。 –

+0

executeQuery()は明示的にSocketExceptionをスローしないため、catchが到達不能なコードとみなされるため、SocketExceptionのキャッチをコンパイルすることはできません。私ができることは、例外をキャッチしてスタックトレースを出力することです。 – dharga

+1

接続にバグがあるようです。 "DBManager.getInstance()。getInpatientConnection();"の結果です。サードパーティのクラスのインスタンスであるオブジェクト? – belgther

答えて

1

は、それがMSSQL JDBCドライバのバグのように見えます。データベースがオフラインのときに例外がスローされた場合は、回避策としてClassCastExceptionをキャッチするだけです。さらに、JDBCドライバは特定の「クラス階層」に依存しているため、Javaバージョンの問題でもあります。