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

Kat*_*hir 57 oracle spring hibernate jdbc

我们使用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
Run Code Online (Sandbox Code Playgroud)

我们使用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>
Run Code Online (Sandbox Code Playgroud)

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

我们在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
Run Code Online (Sandbox Code Playgroud)

Oracle版本:11.2.0.1.0

ste*_*eve 28

对于这样的错误,您应该参与oracle支持.不幸的是,你没有提到你正在使用的oracle版本.该错误可能与优化器绑定查看有关.取决于oracle版本,适用不同的解决方法.

您有两种解决方法:

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

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

  • 用现代数据库管理系统替换我的Oracle安装对我有用. (13认同)
  • 我仍然在11.2.0.2.0 - 64位上得到此错误,重新启动后oracle db - pool不能重新协调.. (5认同)

fye*_*lci 8

我们正面临着同样的问题,我们通过提高分辨它initialSizemaxActive连接池的大小.

你可以查看这个链接

也许这有助于某人.


chr*_*l08 7

另一种情况:如果您要发送日期参数,参数化的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); 
Run Code Online (Sandbox Code Playgroud)

在我们更改日期参数之前,上述操作失败了 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); 
Run Code Online (Sandbox Code Playgroud)


dev*_*bcl 6

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

这可能有以下几个原因:

  1. 网络暂时出现问题。

  2. 错误的 JDBC 驱动程序版本。

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

  4. 数据库错误。

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


小智 5

尝试两件事:

  1. 在oracle服务器上的$ ORACLE_HOME / network / admin / tnsnames.ora中将server = destination设置为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