`
yunnick
  • 浏览: 392521 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle存储过程捕获异常没有抛出导致的JDBC异常

阅读更多

      名字起的好拗口。

      这是一个关于执行超时的问题。

      业务场景是这样的:根据要求,需要每天生成若干报表(原始数据量约为4-5GB),使用一个总的存储过程调度几十个子存储过程(由于有依赖关系,存储过程需要串行执行),为了不影响当天的剩下的工作,生成报表有个容忍时间(2-3小时),超过时间后就需要强行终止。

      在测试中发现,使用setQueryTimeout()方法,或者cancel()方法,超时后存储过程确实终止了,并且在记录中可以看到“ORA-01013: 用户请求取消当前的操作”这个异常,但是下面再执行其他的SQL语句(简单的查询),在java端却也爆出了这个错误,导致该SQL执行出错,而且查看日志可以看到,爆出错误的链接(oracle.jdbc.driver.T4CConnection)和执行存储过程的链接是同一个,其他的连接就没问题。

      以上问题不管用最原始的JDBC,c3p0连接池还是用SpringJdbcTemplate,还是更新OJDBC驱动,都无法解决(数据库是Oracle10),最后折腾了半天也没发现是怎么回事。

     存储过程如下,模拟长时间执行:

     

create or replace procedure pro_test is
 err_msg      varchar2(4000);
begin
for i in 1..60
loop
 insert into scott.prolog(id,date, info)values(i, sysdate,'222');
 DBMS_LOCK.sleep(1);
  commit;
end loop;

 exception
  when others then
     err_msg := sqlerrm;
    rollback;
    insert into scott.prolog(id,date, info)values('err', sysdate,err_msg);
    commit;    
    return;

end;

 

      异常在存储过程中捕获,并进行记录,然后直接返回,但这种方式JDBC端察觉不到任何异常。

      最后,尝试在return之前抛出异常,利用下面的语句:

RAISE_APPLICATION_ERROR(-22222, '系统异常'); 
return; 

       然后,超时后JDBC可以捕获到-22222的SQLException,而且再用相同的链接执行任意SQL也不再报错了。

 

      具体什么原因导致了这种情况不得而知,暂且记录一下。盼望有高手解答。

 

1
0
分享到:
评论

相关推荐

    oracle存储过程(语法实例).pdf

    Java可以通过JDBC调用Oracle存储过程,包括`CallableStatement`对象来执行过程并处理输入/输出参数。 9. **更新与权限保留** 使用`CREATE OR REPLACE PROCEDURE`语句更新存储过程时,原有执行权限不会丢失。 10....

    oracle_存储过程详解

    - `SELECT`语句后跟`INTO`关键字用于将结果存入变量,如果无数据则会抛出`NO_DATA_FOUND`异常,需捕获并处理。 - 别名不应与字段名相同,否则可能导致运行时错误,应避免这种命名冲突。 - 处理`NULL`值时,要注意...

    oracle存储过程学习经典

    6. 使用Hibernate或其他Java框架调用Oracle存储过程,需要了解对应的JDBC API或ORM框架的调用方法。 调用Oracle存储过程的方式有多种,以下是三种常见情况: - **无返回值的存储过程**:这类过程通常用于执行一些...

    oracle存储过程学习经典[语法+实例+调用]

    对于Java开发者,可以使用JDBC的CallableStatement来调用Oracle存储过程。以下是三种常见情况的示例: 1. 无返回值的存储过程: ```java CallableStatement cs = connection.prepareCall("{call procedure_name(?, ...

    Oracle 官方 JDBC Demo JAVA

    JDBC操作可能会抛出异常,如`SQLException`。在示例代码中,应该会看到如何捕获和处理这些异常,以确保程序的健壮性。 7. **Oracle特定功能**: Oracle JDBC驱动程序还提供了Oracle数据库特有的功能,如PL/SQL...

    JDBC 4 ORACLE

    8. **异常处理**: JDBC抛出的SQLException应该被适当地捕获和处理,通常需要根据错误代码或异常消息来定位问题。 9. **关闭资源**: 为了防止内存泄漏,确保在使用完毕后关闭ResultSet、Statement和Connection。 在...

    异常处理和JDBC

    在JDBC操作中,如连接失败、查询错误或数据转换异常等,都可能抛出异常。处理这些异常可以避免程序崩溃,并提供有意义的错误信息。 2. **JDBC API**:JDBC API包括一系列接口和类,如`DriverManager`、`Connection`...

    Oracle 10g JDBC API Reference

    10. **异常处理**:JDBC提供了SQLException,它是所有数据库操作中可能抛出的异常的基类。开发者需要捕获并处理这些异常,确保程序的健壮性。 11. **性能优化**:通过设置JDBC属性,如fetchSize、batchSize等,可以...

    使用JDBC+Oracle完成一个JSP的留言管理程序

    在处理数据库操作时,要捕获可能抛出的`SQLException`,并提供适当的错误信息反馈给用户。 7. **安全性考虑**: - 对用户输入进行验证和清理,防止SQL注入攻击。 - 使用`PreparedStatement`而不是`Statement`,...

    JDBC.rar_java程序_jdbc_oracle

    在进行数据库操作时,需要捕获并处理可能抛出的`SQLException`。这是保证程序健壮性的关键步骤。 9. **资源关闭**: 记住,每次使用完`ResultSet`、`Statement`或`Connection`,都应关闭它们,释放数据库资源。这...

    Java调用存储过程.doc

    在这个例子中,如果诗人不存在,存储过程会抛出一个自定义的错误。在Java代码中,捕获这个异常即可知道诗人未找到。 总的来说,Java调用存储过程是数据库编程中常用的技术,它提供了将数据库操作封装和优化的机会,...

    oracle的JDBC驱动程序.rar

    6. **异常处理**:在JDBC操作中,务必捕获并处理可能抛出的`SQLException`。 注意,为了确保最佳性能和安全性,应使用预编译的`PreparedStatement`而不是`Statement`,避免SQL注入攻击,并及时关闭数据库连接。此外...

    jdbc关于java连oracle连SQL连mySql的jar包

    9. **异常处理**:在使用JDBC时,需要捕获SQLException及其子类,处理数据库操作可能抛出的异常。 10. **性能优化**:通过批处理(Batch Processing)、预编译的PreparedStatement和关闭不必要的资源(如Statement...

    JDBC实用技术(连接Oracle数据库).rar

    例如,当无法获取连接时,可能抛出`SQLException`,此时需要进行相应的错误处理。 8. **安全性** 考虑到安全性,避免在代码中硬编码数据库凭证,推荐使用环境变量或配置文件存储敏感信息,并对SQL语句进行参数化以...

    JAVA 连接oracle数据库工程

    7. **异常处理**:Java的`try-catch-finally`块用于捕获和处理可能抛出的异常,确保即使在出现错误的情况下也能正常关闭数据库连接。 8. **示例代码**: ```java import java.sql.*; public class OracleLinktest ...

    oracle 11g数据库驱动包

    7. **错误处理**:在编程过程中,应适当地捕获和处理可能抛出的异常,如`SQLException`。 Oracle 11g数据库驱动包的使用涉及到Java的JDBC技术,这是一项基础而重要的技能,对于任何需要与Oracle数据库交互的Java...

    非常有用的jdbc的操作数据库

    通常,一个SQL操作可能抛出多种异常,如`CommunicationsException`、`DataIntegrityViolationException`等,需要根据具体情况进行处理。 综上所述,JDBC是Java开发者必备的技能之一,熟练掌握JDBC能帮助我们更好地...

    各种数据库接接方式mysql,sql2000,Oracle

    例如,加载 JDBC 驱动时可能抛出 `ClassNotFoundException` 异常,而建立连接时则可能抛出 `SQLException` 异常。在实际开发过程中,还需要注意资源管理,如及时关闭连接以避免资源泄漏等问题。 以上就是针对“各种...

    java JDBC编程源码

    8. **异常处理**:良好的JDBC代码会包含适当的异常处理,捕获并适当地处理`SQLException`和其他可能抛出的异常。 9. **JDBC API的新特性**:随着Java版本的更新,JDBC API也有所增强,比如JDBC 4.0引入了自动关闭...

Global site tag (gtag.js) - Google Analytics