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

我们使用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) 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,并在我的applciation上下文文件中有以下数据源。

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

我不确定这是否是由于应用程序错误,数据库错误或networking错误。

我们在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的支持。 不幸的是,你没有提到你使用的是什么样的oracle版本。 错误可能与优化器绑定窥视有关。 根据oracle版本的不同,可以使用不同的解决方法。

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

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

当然,只有在oracle支持的build议下才能设置下划线参数

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

你可以检查这个链接

也许这有助于某人。

尝试两件事:

  1. 设置在oracle服务器上的$ ORACLE_HOME / network / admin / tnsnames.ora服务器=专用于server = shared,一次允许多个连接。 重新启动oracle。
  2. 如果你正在使用Java,这可能会帮助你:在java/jdk1.6.0_31/jre/lib/security/Java.security securerandom.source=file:/dev/urandom更改为securerandom.source=file:///dev/urandom

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

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

JDK8,spring框架4.2.4.RELEASE,apache tomcat 7.0.63,Oracle数据库11g企业版11.2.0.4.0

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

您可以将以下configuration参数作为参考:

 <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"/> 

这个configuration足以解决这个错误。 这在上面提到的场景中对我很好。

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

另一种情况:如果您将date参数发送给参数化的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); 

上述失败,直到我们将date参数更改为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); 

是的,正如@ggkmath所说,有时一个很好的重新启动正是你所需要的。 就像“联系作者,让他重写应用程序,同时等待”不是一个选项。

这种情况发生在应用程序未被写入(但)时,它可以处理底层数据库的重新启动。

我得到这个错误,然后重新启动我的客户端应用程序和数据库之间持有连接池的GlassFish服务器,错误消失了。 所以,如果适用,请尝试重新启动应用程序服务器