Oracle 无法从套接字读取更多数据错误
我们使用Oracle作为Web应用程序的数据库。应用程序大部分时间运行良好,但我们遇到了“不再从套接字读取数据”错误 我们使用spring、hibernate和我的应用程序上下文文件中的数据源Oracle 无法从套接字读取更多数据错误,oracle,hibernate,spring,jdbc,Oracle,Hibernate,Spring,Jdbc,我们使用Oracle作为Web应用程序的数据库。应用程序大部分时间运行良好,但我们遇到了“不再从套接字读取数据”错误 我们使用spring、hibernate和我的应用程序上下文文件中的数据源 <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource"> <property name="driverClassName" v
<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版本:11.2.0.1.0对于此类错误,您应该提供Oracle支持。不幸的是,您没有提到您正在使用的oracle版本。该错误可能与优化器绑定窥视有关。根据oracle版本的不同,可采用不同的解决方法 有两种方法可以解决此问题:
- 升级到11.2
- 设置oracle参数
\u optim\u peek\u user\u binds=false
Java/jdk1.6.0\u 31/jre/lib/security/Java.security中changesecurerandom.source=file:/dev/uradom
到securerandom.source=file:///dev/urandom
我收到了这个错误,然后重新启动了GlassFish服务器,该服务器在我的客户端应用程序和数据库之间保留了连接池,错误消失了。因此,如果适用,请尝试重新启动应用程序服务器。我们遇到了相同的问题,我们通过增加连接池的
initialSize
和maxActive
大小来解决它
你可以查一下
也许这对某些人有帮助。将JRE从7降到6为我解决了这个问题。我也有同样的问题。在以下场景下,我能够从应用程序端解决问题: JDK8,SpringFramework 4.2.4.RELEASE,ApacheTomcat 7.0.63,Oracle数据库11g企业版11.2.0.4.0 我使用了数据库连接池
apachetomcatjdbc
:
您可以将以下配置参数作为参考:
<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的更多详细信息:另一种情况:如果要向参数化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);
是的,正如@ggkmath所说,有时候一次好的重启正是你所需要的。比如“联系作者,让他重写应用程序,同时等待”不是一个选项
当应用程序的编写方式(尚未)使其无法处理基础数据库的重新启动时,就会发生这种情况。这是一个非常低级的异常,即ORA-17410 发生这种情况可能有几个原因:
在我的例子中,这是我们在数据库中遇到的一个bug,需要修补。在我们的例子中,我们有一个查询,它使用select*from x加载多个项目,其中(…)中有一些内容
这部分代码对于基准测试来说太长了(17mb作为文本查询)。查询有效,但文本太长。缩短查询解决了问题。我似乎通过删除参数化查询的参数占位符来修复实例 出于某种原因,使用这些占位符工作正常,然后它们停止工作,我得到了错误/bug 作为一种解决方法,我用文字代替占位符,它开始工作 去掉这个
where
SOME_VAR = :1
用这个
where
SOME_VAR = 'Value'
看起来您的Oracle服务器在读取某种结果集时粗暴地断开了您的应用程序连接。此错误很可能发生在使用数据库连接池的应用程序中。当应用程序签出一个已超时或已过时的连接,并使用它连接到数据库时,会发生此错误。@User67546我已将连接池配置设置为在使用之前验证连接。谷歌关键词:德语:“Keine weiteren Daten aus Socket zu lesen”已经联系过oracle,这是一个“optim_peek_用户绑定”问题,我们必须升级或修补它。我仍然在11.2.0.2-64位上遇到这个错误,重新启动oracle db后-池未重新连接..此错误消息表示服务器端发生崩溃。有很多这样的问题,因此不检查服务器端日志,任何修复都只是猜测。大多数情况下,升级到最新支持的JDBC客户端可能是一个好主意。用现代数据库管理系统替换我的Oracle安装对我来说很有用。登录stackoverflow只是为了upvote@K.AlanBates comments是的,当你重新启动应用程序时,问题会消失,但这并不是一个问题的答案,你不能一直这样做,在生产过程中重新启动。这实际上是一个完全正确的答案。当数据库重新启动时,有时依赖的后端/应用程序无法正确处理它。因此,是的,应用程序应该是固定的,但在你需要应用程序响应的时候,这对你没有帮助。重新启动应用程序会有什么影响?您指的是什么问题?OP实际上没有提出任何问题。他没有问“我们应该如何重写应用程序?”这个答案也没有暗示“这是一个长期的解决方案”。当数十人等待应用程序开始响应时,你不会告诉他们“重写它”。
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);
where
SOME_VAR = :1
where
SOME_VAR = 'Value'