为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

料青山看我应如是 2019-12-26 10:42:15

我们正在使用Oracle作为Web应用程序的数据库。该应用程序在大多数情况下都运行良好,但是出现了“不再需要从套接字读取数据”错误。


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)

    ... 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版本:11.2.0.1.0



查看完整描述

3 回答

?
UYOU

对于此类错误,您应该涉及oracle支持。不幸的是,您没有提到正在使用的oracle版本。该错误可能与优化程序绑定偷看有关。根据oracle版本的不同,适用不同的解决方法。

您可以通过两种方法解决此问题:

  • 升级到11.2

  • 设置oracle参数 _optim_peek_user_binds = false

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


查看完整回答
反对 回复 2019-12-26
?
慕容708150

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


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); 


查看完整回答
反对 回复 2019-12-26
?
红颜莎娜

我有同样的问题。在以下情况下,我能够从应用程序一侧解决问题:


JDK8,spring框架4.2.4.RELEASE,Apache Tomcat 7.0.63,Oracle数据库11g企业版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


查看完整回答
反对 回复 2019-12-26

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信