繁体   English   中英

奇怪的JDBC executeQuery异常

[英]Weird JDBC executeQuery exception

我有以下代码:

 public Object RunQuery(String query) throws Exception{
    System.out.println("Trying to run query");
    Statement stmt = null;
    ResultSet rs = null;
    try {
        stmt = conn.createStatement();
        System.out.println("Got Statement");
        rs = stmt.executeQuery(query);
        System.out.println("Query executed");
        ...


    } catch (SQLException ex) {
        // handle any errors
        System.out.println("SQLException: " + ex.getMessage());
        System.out.println("SQLState: " + ex.getSQLState());
        System.out.println("VendorError: " + ex.getErrorCode());
    }
    catch (Exception ex) {
        System.out.println("Exception: " + ex.getMessage());
    }
    finally {
       if (rs != null) {
            try {
                rs.close();
            } catch (SQLException sqlEx) {
            } // ignore
            rs = null;
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException sqlEx) {
            } // ignore
            stmt = null;
        }
       return ret;
    }
}

跑步时效果很好

query = "SELECT * FROM smalltable"

但是失败了

query = "SELECT * FROM bigtable"

大约有20万条记录。 调试器优雅地忽略了catch块,并直接进入了finally块; 当我将stmt.executeQuery(query)添加到监视列表时,NetBeans给了我这个堆栈框架:

>Exception occurred in target VM: Communications link failure  Last packet sent to the server was 0 ms ago.  
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure  Last packet sent to the server was 0 ms ago.

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)

at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)

at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3009)

at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2895)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3438)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2548)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2477)

at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1422)

at RunQuery
Caused by: java.net.SocketException: Software caused connection abort: recv failed

at java.net.SocketInputStream.socketRead0(Native Method)

at java.net.SocketInputStream.read(SocketInputStream.java:129)

at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:157)

at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)

at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2452)

at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2962)

... 9 more




如何在此框架中进行大型查询?



编辑:我正在使用J连接器和mysql服务器5.1; 连接字符串是

jdbc:mysql://localhost?user=root&password=password

是的,我知道select *是一种不好的做法,但是如您所见,我才刚刚开始,这或多或少是我正在进行的第二项测试

我能想到的唯一会导致差异的是某种网络级别的超时,而Netbeans输出肯定会指向这个方向。 您正在使用的JDBC连接字符串是什么? 也许有一个超时参数可以提高?

如果问题仍然存在,并查看该级别的通信情况,则可能还需要插入网络数据包嗅探器。 通过短查询和长查询来“发现差异”,您可能会很好地了解使一个失败而另一个成功的原因。

(通常, select *是一个坏主意,因为它会不必要地带回所有额外的数据。在这种情况下,与从较小的表中进行选择相比,从大表中的所有行中选择所有列显然会给连接带来麻烦我知道,在这种情况下,您的问题仍然有效,因为有时您可能需要这样做,并且除了选择更大表的子集外,可能还会做同样的事情,但是我只是指出这是一般准则如果您在生产中将其用作快捷方式。)

我立即想到的是,获取所有数据可能会出现内存问题。 我不知道如何为此目的设置MySQL,但是您可能想尝试在ResultSet中设置获取大小或通过选择较少的列来限制ResultSet大小。 JDBC驱动程序可能试图通过一项操作来获取整个表。

附带说明,请不要执行stmt.executeQuery(query)。 始终使用PreparedStatement并绑定查询参数。 在您的示例中,没有参数,但这对安全性至关重要。 切勿将SQL与“文字”参数一起使用(例外是当文字是受信任的字符串(如代码中的常量)或非字符串类型(如已解析的数字)时。

如果它直接跳到了最后,那么在其他代码中抛出的“异常”实际上是Error的后代吗? 那将完全避免您被抓住。

您可能已经获得了OutOfMemoryError,然后由于OOME关闭了某些东西而获得了网络异常?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM