java jdbc连接 超时_java - JDBC Oracle Thin ORA-02396连接空闲超时 - 堆栈内存溢出

这篇博客探讨了在没有使用连接池的情况下,如何处理Java JDBC与Oracle数据库连接的空闲超时问题。作者遇到了ORA-02396错误,即超过了最大空闲时间,需要重新连接。尽管查询USER_RESOURCE_LIMITS返回“无限”,但问题仍然存在。堆栈跟踪显示了异常的具体位置,并讨论了可能的解决方案和数据库用户配置文件的潜在影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我支持一些遗留代码,直到最近它一直都很好。 我是否在寻找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());

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值