没有更多数据可以从套接字错误中读取

Posted

技术标签:

【中文标题】没有更多数据可以从套接字错误中读取【英文标题】:No more data to read from socket error 【发布时间】:2011-12-11 23:58:54 【问题描述】:

我们使用 Oracle 作为我们 Web 应用程序的数据库。应用程序大部分时间都运行良好,但我们收到“No more data to read from socket”错误。

Caused by: java.sql.SQLRecoverableException: No more data to read from socket
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1142)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1099)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:288)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:863)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1153)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1275)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3620)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1869)
    at org.hibernate.loader.Loader.doQuery(Loader.java:718)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
    at org.hibernate.loader.Loader.doList(Loader.java:2449)
    ... 63 more

我们使用 spring、hibernate,并且我的应用上下文文件中的数据源有以下内容。

<bean class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" id="dataSource">
        <property name="driverClassName" value="$database.driverClassName" />
        <property name="url" value="$database.url" />
        <property name="username" value="$database.username" />
        <property name="password" value="$database.password" />
        <property name="defaultAutoCommit" value="false" />
        <property name="initialSize" value="10" />
        <property name="maxActive" value="30" />
        <property name="validationQuery" value="select 1 from dual" />
        <property name="testOnBorrow" value="true" />
        <property name="testOnReturn" value="true" />
        <property name="poolPreparedStatements" value="true" />
        <property name="removeAbandoned" value="true" />
        <property name="logAbandoned" value="true" />
    </bean>

我不确定这是因为应用程序错误、数据库错误还是网络错误。

我们在 oracle 日志中看到以下内容

Thu Oct 20 10:29:44 2011
Errors in file d:\oracle\diag\rdbms\ads\ads\trace\ads_ora_3836.trc  (incident=31653):
ORA-03137: TTC protocol internal error : [12333] [4] [195] [3] [] [] [] []
Incident details in: d:\oracle\diag\rdbms\ads\ads\incident\incdir_31653\ads_ora_3836_i31653.trc
Thu Oct 20 10:29:45 2011
Trace dumping is performing id=[cdmp_20111020102945]
Thu Oct 20 10:29:49 2011
Sweep [inc][31653]: completed
Sweep [inc2][31653]: completed
Thu Oct 20 10:34:20 2011
Errors in file d:\oracle\diag\rdbms\ads\ads\trace\ads_ora_860.trc  (incident=31645):
ORA-03137: TTC protocol internal error : [12333] [4] [195] [3] [] [] [] []
Incident details in: d:\oracle\diag\rdbms\ads\ads\incident\incdir_31645\ads_ora_860_i31645.trc
Thu Oct 20 10:34:21 2011

Oracle 版本:11.2.0.1.0

【问题讨论】:

看起来您的 Oracle 服务器在读取某种结果集时粗鲁地断开了您的应用程序连接。 此错误最有可能发生在使用数据库连接池的应用程序中。当应用程序检出一个已超时或已失效的连接,并使用它连接到数据库时,就会出现此错误。 @User67546 我已设置连接池配置以在使用前验证连接。不应该忽视陈旧的连接 你得到完全相同的错误和堆栈吗? google 的关键字:德语:"Keine weiteren Daten aus Socket zu lesen" 【参考方案1】:

对于这样的错误,您应该使用 oracle 支持。不幸的是,您没有提及您使用的是什么 oracle 版本。该错误可能与优化器绑定偷看有关。根据 oracle 版本,适用不同的解决方法。

你有两种方法来解决这个问题:

升级到 11.2 设置oracle参数_optim_peek_user_binds = false

当然,只有在 oracle 支持的建议下才应该设置下划线参数

【讨论】:

已联系 oracle,这是一个 _optim_peek_user_binds 问题,我们必须升级或修补它。 我在 11.2.0.2.0 - 64 位上仍然收到此错误,重启 oracle db - pool not reconnerct.. 此错误消息表示服务器端发生崩溃。其中有很多,因此如果不检查服务器端日志,任何修复都只是猜测。大多数时候,升级到最新支持的 JDBC 客户端可能是个好主意。 用现代数据库管理系统替换我安装的 Oracle 对我有用。 登录 *** 只是为了支持@K.AlanBates 评论【参考方案2】:

尝试两件事:

    在 oracle 服务器上的 $ORACLE_HOME/network/admin/tnsnames.ora 中设置 server=dedicated to server=shared 以允许一次多个连接。重启 oracle。 如果您使用 Java,这可能会对您有所帮助:在 java/jdk1.6.0_31/jre/lib/security/Java.security 中将 securerandom.source=file:/dev/urandom 更改为 securerandom.source=file:///dev/urandom

【讨论】:

【参考方案3】:

我收到此错误,然后重新启动了我的 GlassFish 服务器,该服务器在我的客户端应用程序和数据库之间保存了连接池,错误消失了。因此,如果适用,请尝试重新启动您的应用程序服务器。

【讨论】:

是的,当您重新启动应用程序时问题就会消失,但这不是问题的答案,您不能在生产中一直进行重新启动。 这实际上是一个完全合法的答案。当数据库重新启动时,有时依赖的后端/应用程序无法正确处理它。所以是的,应该修复应用程序,但是当您需要应用程序响应时,这对您没有帮助。重启应用即可。 @javagirl 你指的是什么问题? OP 实际上没有说出 any 问题。他没有问“我们应该如何重写应用程序?”而且这个答案也不暗示“这是一个长期的解决方案”。当数十人在等待应用开始响应时,您不要告诉他们“重写它”。【参考方案4】:

我们遇到了同样的问题,我们通过增加连接池的initialSizemaxActive 大小来解决它。

您可以查看this link

也许这对某人有帮助。

【讨论】:

【参考方案5】:

将 JRE 从 7 降级到 6 为我解决了这个问题。

【讨论】:

只是一个想法,可能是因为 JDBC 驱动程序版本的原因:11.2.0.4 支持 JDK 6、7 和 8,但 11.2.0.3 仅支持 JDK 6 oracle.com/technetwork/apps-tech/jdbc-112010-090769.html【参考方案6】:

我遇到了同样的问题。在以下情况下,我能够从应用程序端解决问题:

JDK8、spring framework 4.2.4.RELEASE、apache tomcat 7.0.63、Oracle Database 11g Enterprise Edition 11.2.0.4.0

我使用了数据库连接池apache tomcat-jdbc

可以参考以下配置参数:

<Resource name="jdbc/exampleDB"
      auth="Container"
      type="javax.sql.DataSource"
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
      testWhileIdle="true"
      testOnBorrow="true"
      testOnReturn="false"
      validationQuery="SELECT 1 FROM DUAL"
      validationInterval="30000"
      timeBetweenEvictionRunsMillis="30000"
      maxActive="100"
      minIdle="10"
      maxWait="10000"
      initialSize="10"
      removeAbandonedTimeout="60"
      removeAbandoned="true"
      logAbandoned="true"
      minEvictableIdleTimeMillis="30000"
      jmxEnabled="true"
      jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
        org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
      username="your-username"
      password="your-password"
      driverClassName="oracle.jdbc.driver.OracleDriver"
      url="jdbc:oracle:thin:@localhost:1521:xe"/>

此配置足以修复错误。在上述情况下,这对我来说很好。

有关设置 apache tomcat-jdbc 的更多详细信息:https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

【讨论】:

我正在使用 JDK1.8、SpringJDBCTemplate、OracleDB、SpringRestService 和 org.commons.dbcp.BasicDataSource。间歇性地收到此错误。如果使用上述给定的属性,我会遇到任何问题吗?【参考方案7】:

另一种情况:如果您将日期参数发送到参数化 sql,请确保您发送的是 java.sql.Timestamp 而不是 java.util.Date。否则你会得到 ​​p>

java.sql.SQLRecoverableException: 没有更多数据可以从套接字读取

示例语句: 在我们的 java 代码中,我们使用org.apache.commons.dbutils,我们有以下内容:

final String sqlStatement = "select x from person where date_of_birth between ? and ?";
java.util.Date dtFrom = new Date(); //<-- this will fail
java.util.Date dtTo = new Date();   //<-- this will fail
Object[] params = new Object[] dtFrom , dtTo ;
final List mapList = (List) query.query(conn, sqlStatement, new MapListHandler(),params); 

在我们将日期参数更改为 java.sql.Timestamp 之前,上述操作一直失败

java.sql.Timestamp tFrom = new java.sql.Timestamp (dtFrom.getTime()); //<-- this is OK
java.sql.Timestamp tTo = new java.sql.Timestamp(dtTo.getTime());   //<-- this is OK
Object[] params = new Object[] tFrom , tTo ;
final List mapList = (List) query.query(conn, sqlStatement, new MapListHandler(),params); 

【讨论】:

【参考方案8】:

是的,正如@ggkmath 所说,有时一个好的旧重启正是您所需要的。比如“联系作者,让他重写应用,同时等待”不是一个选项。

当应用程序没有(还)以可以处理底层数据库重启的方式编写时,就会发生这种情况。

【讨论】:

【参考方案9】:

这是一个非常低级的异常,即 ORA-17410。

这可能有几个原因:

    一个暂时的网络问题。

    错误的 JDBC 驱动程序版本。

    特殊数据结构的一些问题(在数据库端)。

    数据库错误。

就我而言,这是我们在数据库中遇到的一个错误,需要修补。

【讨论】:

【参考方案10】:

在我们的例子中,我们有一个查询,它使用 select * from x where something in (...) 加载多个项目 基准测试的部分时间太长了。(17mb 作为文本查询)。查询有效,但文本很长。缩短查询解决了这个问题。

【讨论】:

【参考方案11】:

我似乎通过删除参数化查询的参数占位符来修复我的实例。

由于某种原因,使用这些占位符工作正常,然后它们停止工作,我得到了错误/错误。

作为一种解决方法,我用文字代替了占位符,它开始工作了。

删除这个

where 
    SOME_VAR = :1

使用这个

where 
    SOME_VAR = 'Value'

【讨论】:

【参考方案12】:

似乎是视图的问题。 JDBC 查询正在使用视图。我猜了一下,重新编译视图,错误消失了。

【讨论】:

以上是关于没有更多数据可以从套接字错误中读取的主要内容,如果未能解决你的问题,请参考以下文章

使用触发器时收到错误“没有更多数据从套接字读取”

Oracle 启动SQL Developer提示无法从套接字读取更多的数据

ORACLE数据连接报错无法从套接字读取更多的数据怎么解决

java连oracle中连不上,错误是“无法从套接字读取更多的数据”,是啥问题?

oracle 11g developer 无法从套接字读取更多的数据 求解决 请问这个问题你解决了吗?

java.sql.SQLException: 无法从套接字读取更多的数据