- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在 JDBC 语句上设置查询超时,并期望它在超时时抛出 SQLTimeoutException。但是我得到了一个错误代码为 ORA-01013 的通用 SQLException。
知道我一定遗漏了什么吗?
我正在寻找一种独立于数据库的方法来处理超时。检查数据库特定的错误代码可能无济于事。
顺便说一句,我通过 Spring 的 JdbcTemplate 设置这个属性。
myStatement.setQueryTimeout(1);
抛出
java.sql.SQLException: ORA-01013: user requested cancel of current operation
编辑:这是错误的堆栈跟踪。我正在使用瘦驱动程序 (ojdbc6-11.2.0.1.0.jar)。
java.sql.SQLException: ORA-01013: user requested cancel of current operation
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:861)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1145)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1259)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3493)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:703)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:722)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:772)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:211)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:219)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:233)
at mytest.MyDAO.retrieve(MyDAO.java:12)
最佳答案
这是驱动程序用来抛出异常/错误的代码,它不会将异常映射到 SQLTimeoutException。这是 oracle 驱动程序实现中的差距
下面完整方法的片段是
DatabaseError.throwSqlException(this.meg.conv
.CharBytesToString(this.errorMsg, this.errorLength[0],
true), DatabaseError
.ErrorToSQLState(this.retCode), this.retCode);
完整的方法是这样的
/* */
/* */void processError(boolean paramBoolean,
OracleStatement paramOracleStatement)
/* */throws SQLException
/* */{
/* 303 */if (this.retCode != 0)
/* */{
/* 311 */switch (this.retCode)
/* */{
/* */case 28:
/* */
case 600:
/* */
case 1012:
/* */
case 3113:
/* */
case 3114:
/* 323 */this.connection.internalClose();
/* */}
/* */
/* 328 */if (paramBoolean)
/* */{
**/* 331 */
*DatabaseError.throwSqlException(this.meg.conv
.CharBytesToString(this.errorMsg, this.errorLength[0],
true), DatabaseError
.ErrorToSQLState(this.retCode), this.retCode);*
/* */}
/* */else
/* */{
/* 335 */return;
/* */}
/* */
/* */}
/* */
/* 341 */if (!paramBoolean) {
/* 342 */return;
/* */}
/* */
/* 351 */if ((this.warningFlag & 0x1) == 1)
/* */{
/* 353 */int i = this.warningFlag & 0xFFFFFFFE;
/* */
/* 356 */if (((i & 0x20) == 32) || ((i & 0x4) == 4)) {
/* 357 */throw DatabaseError.newSqlException(110);
/* */}
/* */}
/* */
/* 361 */if ((this.connection != null)
&& (this.connection.plsqlCompilerWarnings))
/* */{
/* 363 */if ((this.flags & 0x4) == 4)
/* 364 */paramOracleStatement.foundPlsqlCompilerWarning();
/* */}
/* */}
关于JDBC 超时不抛出 SQLTimeoutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26130912/
我试图在 JDBC 语句上设置查询超时,并期望它在超时时抛出 SQLTimeoutException。但是我得到了一个错误代码为 ORA-01013 的通用 SQLException。 知道我一定遗漏
我以这种方式将 play-slick 与 slick 3.0.0 一起使用: 我通过 获得了连接 val conn = db.createSession.conn 然后得到语句: val statem
我用 PostgreSQL 9.4 数据库创建了一个空的(激活器模板 play-scala)Play 2.4.3 应用程序并尝试使用 Slick 3.1.0,但它抛出错误: play.api.Unex
我有一个带有签名的 T-SQL 存储过程 CREATE PROCEDURE MyProc @recordCount INT OUTPUT @param1 INT ... 当直接在 Sql Server
我是一名优秀的程序员,十分优秀!