【问题标题】:JDBC Connection throwing SocketExceptionJDBC连接抛出SocketException
【发布时间】:2011-11-22 16:17:21
【问题描述】:

我有一个在 WAS 7.0 上运行的 Web 应用程序,该应用程序可以运行,并且一次可以运行几个星期,没有任何问题。突然之间,当尝试针对 MS SQL 2005 执行 PreparedStatement 时,它会开始抛出 SocketExceptions。起初,我们开始研究一些可能导致这种情况的明显问题,例如未关闭连接、服务器重新启动、连接池大小等。但什么都没有发生。我们在池中尝试了 WAS 的连接重试,但没有成功。与服务器重启没有一致的相关性。

我们正在运行 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

【问题讨论】:

  • 为了获得有关 SocketException 的更多信息,您应该为 SocketException 放置一个特定的 catch 并打印该堆栈跟踪,然后再次抛出 SocketException。您运行代码的环境并未显示您的 SocketException 拥有的所有信息,因为它试图将其转换为 SQLException(它不是其子类)。
  • 为 SocketException 设置 catch 无法编译,因为 executeQuery() 没有显式抛出 SocketException,因此该 catch 被视为无法访问的代码。我能做的是捕获一个异常并打印该堆栈跟踪。
  • 您的连接中似乎存在错误。是“DBManager.getInstance().getInpatientConnection();”的结果作为第三方类的实例的对象?

标签: java sql-server jsf jdbc websphere


【解决方案1】:

从您的堆栈跟踪来看,它看起来像是 MSSQL JDBC 驱动程序中的一个错误。如果在数据库脱机时抛出异常,您所能做的就是捕获 ClassCastException 作为解决方法。此外,它也可能是 Java 版本问题,因为 JDBC 驱动程序依赖于特定的“类层次结构”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-09
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多