JDBC Oracle Thin ORA-02396连接空闲超时

时间:2014-03-11 23:08:00

标签: java oracle jdbc connection timeout

我支持一些遗留代码,直到最近才开始使用它。我正在寻找是否有JDBC Oracle瘦连接的设置,我可以通过Java指定空闲超时(没有连接池)?在线资源很多都是指连接池...在我的情况下甚至是可能的(在非池化情况下指定空闲超时)?或者是空闲时间设置特定数据库用户帐户?

更新+问题

  1. 我能够以用户身份登录,并运行查询以尝试查找资源限制。 select * from USER_RESOURCE_LIMITS;但是一切都回来了#34; UNLIMITED"。是否有可能将另一个值(例如来自JDBC连接)覆盖" UNLIMITED"?

  2. 因此,作业保持连接,同时我们通过数据库链接主动查询另一个系统,持续时间大约为2小时......现在,为什么空闲超时会发挥作用?

  3. 更新#2

    我们切换到另一个帐户(具有相同类型的DB链接设置),并且该作业能够像以前一样完成。哪种方式指向Oracle用户配置文件中的某些内容?但就像我说的那样,查询USER_RESOURCE_LIMITS显示两个用户都有#34; UNLIMITED"空闲时间。 DBA也证实了这一点。还有什么可能造成这种差异?

    更新#3

    堆栈跟踪等。

    java.sql.SQLException: ORA-02396: exceeded maximum idle time, please connect again
    ORA-06512: at line 1
    
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:316)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:282)
        at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:639)
        at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:184)
        at oracle.jdbc.driver.T4CCallableStatement.execute_for_rows(T4CCallableStatement.java:873)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1086)
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2984)
        at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3076)
        at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4273)
        at com.grocery.stand.Helper.getAccess(Helper.java:216)
        at com.grocery.stand.fruitbasket.Dao.getPriceData(Dao.java:216)
        at com.grocery.stand.fruitbasket.Dao.getPricees(Dao.java:183)
        at com.grocery.stand.fruitbasket.UpdatePrice.updateAllFruitPrices(UpdatePrice.java:256)
        at com.grocery.stand.fruitbasket.UpdatePrice.main(UpdatePrice.java:58)
    SQL Exception while getting Data from SYSTEM_B
    Exception while updating pricing : ORA-01012: not logged on
    
    Exception in thread "main" java.sql.SQLException: ORA-01012: not logged on
    
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:316)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:277)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:272)
        at oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:129)
        at oracle.jdbc.driver.T4CConnection.do_rollback(T4CConnection.java:478)
        at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:1045)
        at com.grocery.stand.Helper.rollBack(Helper.java:75)
        at com.grocery.stand.fruitbasket.UpdatePrice.updatePartNumbers(UpdatePrice.java:291)
        at com.grocery.stand.fruitbasket.UpdatePrice.main(UpdatePrice.java:58)
    

    连接代码

        public  static Connection openConnection() throws SQLException {
    
    
        String userName = propBundle.getString(DB_UID);
        String password = propBundle.getString(DB_PWD);
        String url = propBundle.getString(DB_URL);
    
    
        Connection conn = null;
        try {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            conn = (Connection) DriverManager.getConnection(url, userName,
                    password);
            conn.setAutoCommit(false);
        } catch (SQLException sqle) {
            sqle.printStackTrace(System.out);
            throw sqle;
        }
        return conn;
    }
    

    execute()

    发生错误
    public static void getSystemAccess(Connection dbConnection) throws SQLException {
      try {
          CallableStatement authStmt = null;
          String authorize = "CALL ABC.ACCESS_PROCEDURE@some_db_link()";
          authStmt = dbConnection.prepareCall(authorize);
          authStmt.execute();
          authStmt.close();
      } catch (SQLException sqle1) {
          sqle1.printStackTrace();
          throw new SQLException(sqle1.getMessage());
      }
    }
    

1 个答案:

答案 0 :(得分:0)

我不确定我理解你提出的问题。

您获得的错误表明您用于连接数据库的Oracle用户配置了一个配置文件(在Oracle中),该配置文件限制了连接空闲的时间。当连接空闲时间过长时,Oracle会终止您的连接。通常,解决此类问题的方法是转到DBA并要求增加空闲时间或查看代码并查看连接打开和未使用的原因。如果您使用的是连接池(它看起来不是这样),那么某些连接可以长时间保持打开和空闲状态。由于您似乎没有使用连接池,因此问题是应用程序是否有意义长时间保持打开连接而不做任何事情。如果应用程序在用户在上午9点登录时打开连接,并且在用户在下午5点关闭之前没有关闭它,则可以在数据库中调整此用户的IDLE_TIME设置。否则,您可能想要调查应用程序是否在逻辑上有意义地保持打开数据库连接这么长时间而不做某事或者是否可以修改应用程序以在不再需要时关闭连接。