我支持一些遗留代码,直到最近它一直都很好。 我是否在寻找JDBC Oracle瘦连接的设置,我可以在其中通过Java指定空闲超时(无连接池)? 在线上有很多资源都提到了连接池...在我的情况下,是否有可能(在非池化情况下指定空闲超时)? 还是空闲时间是特定数据库用户帐户上的设置?
更新与问题
我能够以用户身份登录,并运行查询以尝试找出资源限制。 select * from USER_RESOURCE_LIMITS; 但是一切都回到了“无限”。 是否可以使用另一个值(例如,来自JDBC连接的值)覆盖“ UNLIMITED”?
因此,当我们通过DB链接主动查询另一个系统长达约2个小时以上的时间时,这项工作就保持了连接状态。现在,为什么空闲超时甚至会起作用?
更新#2
我们切换到另一个帐户(具有相同的数据库链接设置),该工作能够像以前一样完成。 甲骨文用户配置文件有哪些奇特之处? 但是就像我说的那样,查询USER_RESOURCE_LIMITS显示两个用户都具有“ 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()错误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());
}
}
这篇博客探讨了在没有使用连接池的情况下,如何处理Java JDBC与Oracle数据库连接的空闲超时问题。作者遇到了ORA-02396错误,即超过了最大空闲时间,需要重新连接。尽管查询USER_RESOURCE_LIMITS返回“无限”,但问题仍然存在。堆栈跟踪显示了异常的具体位置,并讨论了可能的解决方案和数据库用户配置文件的潜在影响。
2036

被折叠的 条评论
为什么被折叠?



