Нет больше данных для чтения из ошибки сокета
мы используем 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
размер пула подключений.
Вы можете проверить этой ссылке
возможно, это кому-то помогает.
попробуйте две вещи:
- установить в $ORACLE_HOME, т./сети/администратор/файла tnsnames.ora на сервере oracle server = выделенный серверу=общий, чтобы разрешить несколько соединений одновременно. Перезапустите oracle.
- если вы используете Java, это может помочь вам:
java/jdk1.6.0_31/jre/lib/security/Java.security
изменитьsecurerandom.source=file:/dev/urandom
tosecurerandom.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);
у меня была та же проблема. Я смог решить проблему со стороны приложения по следующему сценарию:
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.
Это может произойти по нескольким причинам:
временная проблема в сети.
неправильная версия драйвера JDBC.
некоторые проблемы со специальной структурой данных (на стороне базы данных).
ошибка базы данных.
в моем случае это была ошибка, мы попали в базу данных, которая должна быть исправленный.
да, как сказал @ggkmath, иногда хороший старый перезапуск-это именно то, что вам нужно. Например, когда "свяжитесь с автором и попросите его переписать приложение, тем временем подождите", это не вариант.
Это происходит, когда приложение не написано (пока) таким образом, чтобы оно могло обрабатывать перезапуски базовой базы данных.
Я получил эту ошибку, затем перезапустил мой сервер GlassFish, который содержал пулы соединений между моим клиентским приложением и базой данных, и ошибка ушла. Итак, попробуйте перезапустить сервер приложений, если это применимо.