我们使用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>
我不确定这是因为应用程序错误,数据库错误还是网络错误。
我们在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
答案 0 :(得分:28)
对于这样的错误,您应该参与oracle支持。不幸的是,你没有提到你正在使用的oracle版本。该错误可能与优化器绑定查看有关。取决于oracle版本,适用不同的解决方法。
您有两种解决方法:
_optim_peek_user_binds = false
当然,只有在oracle支持
建议的情况下才应设置下划线参数答案 1 :(得分:8)
答案 2 :(得分:6)
另一种情况:如果要将日期参数发送到参数化的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);
答案 3 :(得分:5)
尝试两件事:
java/jdk1.6.0_31/jre/lib/security/Java.security
将securerandom.source=file:/dev/urandom
更改为securerandom.source=file:///dev/urandom
答案 4 :(得分:4)
我遇到了同样的问题。在以下情况下,我能够从应用程序端解决问题:
JDK8,spring framework 4.2.4.RELEASE,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"/>
此配置足以修复错误。在上面提到的场景中,这对我来说很好。
有关setup apache tomcat-jdbc:https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html
的更多详细信息答案 5 :(得分:3)
将JRE从7降级为6为我解决了这个问题。
答案 6 :(得分:3)
这是一个非常低级别的例外,它是ORA-17410。
可能有几个原因:
网络上的临时问题。
错误的JDBC驱动程序版本。
特殊数据结构的一些问题(在数据库方面)。
数据库错误。
就我而言,这是我们在数据库上遇到的一个错误,需要修补。
答案 7 :(得分:0)
是的,正如@ggkmath所说,有时一个好的旧重启正是你所需要的。就像&#34;联系作者并让他重写应用程序,同时等待&#34;不是一种选择。
如果某个应用程序尚未以可以处理基础数据库重新启动的方式编写,则会发生这种情况。
答案 8 :(得分:0)
在我们的案例中,我们有一个查询,该查询使用x中的select *加载多个项目,其中(...) 该部分用于基准测试的时间太长了(17mb作为文本查询)。查询有效,但文本太长。缩短查询即可解决问题。
答案 9 :(得分:0)
我似乎通过删除参数化查询的参数占位符来修复实例。
由于某些原因,使用这些占位符可以正常工作,然后它们停止工作,并且出现错误/错误。
作为一种解决方法,我用文字代替了占位符,然后开始工作。
删除此
where
SOME_VAR = :1
使用此
where
SOME_VAR = 'Value'
答案 10 :(得分:-2)
我收到此错误,然后重新启动了我的客户端应用程序和数据库之间保持连接池的GlassFish服务器,错误就消失了。因此,尝试重新启动应用程序服务器(如果适用)。