Нет больше данных для чтения из ошибки сокета

мы используем Oracle в качестве базы данных для нашего веб-приложения. Приложение работает хорошо большую часть времени, но мы получаем эту ошибку "нет больше данных для чтения из сокета".

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>

Я не уверен, что это из-за ошибок приложений, ошибок базы данных или сетевых ошибок.

мы видим следующее на oracle журналы

Thu Oct 20 10:29:44 2011
Errors in file d:oraclediagrdbmsadsadstraceads_ora_3836.trc  (incident=31653):
ORA-03137: TTC protocol internal error : [12333] [4] [195] [3] [] [] [] []
Incident details in: d:oraclediagrdbmsadsadsincidentincdir_31653ads_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:oraclediagrdbmsadsadstraceads_ora_860.trc  (incident=31645):
ORA-03137: TTC protocol internal error : [12333] [4] [195] [3] [] [] [] []
Incident details in: d:oraclediagrdbmsadsadsincidentincdir_31645ads_ora_860_i31645.trc
Thu Oct 20 10:34:21 2011

Версия Oracle: 11.2.0.1.0

9 ответов


для таких ошибок необходимо задействовать поддержку oracle. К сожалению, вы не упоминаете, какой выпуск oracle вы используете. Ошибка может быть связана с оптимизатором bind peeking. В зависимости от версии oracle применяются различные обходные пути.

у вас есть два способа решить эту проблему:

  • обновить 11.2
  • установить параметр oracle _optim_peek_user_binds = false

конечно, параметры подчеркивания должны быть установлены только по рекомендации поддержка oracle


мы столкнулись с той же проблемой, мы решили ее, увеличив initialSize и maxActive размер пула подключений.

Вы можете проверить этой ссылке

возможно, это кому-то помогает.


попробуйте две вещи:

  1. установить в $ORACLE_HOME, т./сети/администратор/файла tnsnames.ora на сервере oracle server = выделенный серверу=общий, чтобы разрешить несколько соединений одновременно. Перезапустите oracle.
  2. если вы используете Java, это может помочь вам:java/jdk1.6.0_31/jre/lib/security/Java.security изменить securerandom.source=file:/dev/urandom to securerandom.source=file:///dev/urandom

другой случай: если вы отправляете параметры даты в параметризованный 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); 

понижение JRE с 7 до 6 исправило эту проблему для меня.


у меня была та же проблема. Я смог решить проблему со стороны приложения по следующему сценарию:

JDK8, рамки весны 4.2.4.Выпуск, 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


это исключение очень низкого уровня, которое является ORA-17410.

Это может произойти по нескольким причинам:

  1. временная проблема в сети.

  2. неправильная версия драйвера JDBC.

  3. некоторые проблемы со специальной структурой данных (на стороне базы данных).

  4. ошибка базы данных.

в моем случае это была ошибка, мы попали в базу данных, которая должна быть исправленный.


да, как сказал @ggkmath, иногда хороший старый перезапуск-это именно то, что вам нужно. Например, когда "свяжитесь с автором и попросите его переписать приложение, тем временем подождите", это не вариант.

Это происходит, когда приложение не написано (пока) таким образом, чтобы оно могло обрабатывать перезапуски базовой базы данных.


Я получил эту ошибку, затем перезапустил мой сервер GlassFish, который содержал пулы соединений между моим клиентским приложением и базой данных, и ошибка ушла. Итак, попробуйте перезапустить сервер приложений, если это применимо.