Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 无法从套接字读取更多数据错误_Oracle_Hibernate_Spring_Jdbc - Fatal编程技术网

Oracle 无法从套接字读取更多数据错误

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

我们使用Oracle作为Web应用程序的数据库。应用程序大部分时间运行良好,但我们遇到了“不再从套接字读取数据”错误

我们使用spring、hibernate和我的应用程序上下文文件中的数据源

<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
当然,只有在oracle支持人员建议的情况下才应设置下划线参数

  • 在ORACLE server服务器=专用于服务器=共享上设置$ORACLE_HOME/network/admin/tnsnames.ora,以允许一次连接多个。重新启动oracle
  • 如果您正在使用Java,这可能会对您有所帮助:在
    Java/jdk1.6.0\u 31/jre/lib/security/Java.security中
    change
    securerandom.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

    发生这种情况可能有几个原因:

  • 网络的暂时问题

  • 错误的JDBC驱动程序版本

  • 特殊数据结构(数据库端)的一些问题

  • 数据库错误


  • 在我的例子中,这是我们在数据库中遇到的一个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'