ORA-04068 / ORA-04065 / ORA-06508 详细说明

关于在运行ORACLE 包发生ORA-04068 / ORA-04065 / ORA-06508 代码异常的原因只有一个,那就是包含了全局变量/常量的包,在会话保留期间被执行了编译。

对于此类错误,我翻看了大量其他博主的博客,有以下内容可供各位参考:

http://jasonvogel.blogspot.co.uk/2008/03/how-to-deal-with-frustrating-ora-04068.html

http://www.itpub.net/thread-1019858-1-1.html

http://dbj2ee.blogspot.co.uk/2007/10/dealing-with-oracle-plsql-error-ora.html

http://blog.csdn.net/ningxuezhu/article/details/8880545

http://blog.csdn.net/fm0517/article/details/4866361

http://www.sosdb.com/tech/oracle_rac/45bbs2.htm

http://zheng19851.iteye.com/blog/2001904

http://www.bijishequ.com/detail/88954

http://www.cnblogs.com/zhangxsh/p/3494303.html


大致得到的结论如下:

1.全局变量不要和相关的函数、存储过程定义在一个包里面,而是单独定义,单独定义的目的是减少被重新编译的概率。
2.不要使用全局变量,如果要使用,则参考1.

这是对于系统设计之初的情况,在设计的时候已经考虑到这三种情况了,可以优雅的处理。

但是对于已经在使用的程序,如果不能很确定的梳理出Package依赖关系,那么这将是一场灾难。

不过可以用这两位的方法作为参考(个人没有使用过更改系统设置和Spring环绕通知的方法,持保留意见。)


http://blog.csdn.net/ningxuezhu/article/details/8880545

3。如果你的项目中用到了Spring框架,那你一定会知道Spring的环绕通知,所谓环绕通知,就是在方法执行前和执行后都会调用这个通知,在这个通知里,你可以改变传入方法的参数,也可以修改方法的返回值,当然还有前置通知和后置通知,不懂的朋友自己去查资料吧,我的打算是给需要调用包的方法都加上环绕通知,然后在方法执行完判断是否出现了4068异常,如果出现了此异常,就再去执行一次,这样就不会出现查不到数据的情况了,而且源代码不需要改动,只要加配置文件和一个类就Ok,如果没有用到spring那就自己想办法吧,可以在执行的时候判断是否出现4068异常,然后再重新查询,反正思路大致就是这样,网上还有一种做法,我觉得也还不错,就是将callableStatement,PreparedStatement,Statement这些类中的执行数据库操作的方法重写,然后判断有没有出现4068异常,如果出现,再执行一次,这要求你在有可能出现4068异常的地方执行数据库操作都使用自己重写过的类,如果项目庞大并且已经成型,你会晕的,如果在项目搭建的时候就考虑到4068异常,这也未尝不是一个好方法。

(其中提到的重写执行数据库操作的方法可以参考http://www.cnblogs.com/huanghongbo/p/8371230.html)


http://www.sosdb.com/tech/oracle_rac/45bbs2.htm

解决方法如下:
alter system set event '10046 trace name context off';
alter system set timed_statistics=false;

如果remote_dependencies的值是timestamp,也就是系统对远程对象的合法性检查时用的方法是时间戳法
alter system set remote_dependencies_mode
利用以上SQL将系统参数改变后,又根据数据库的当前情况调整了一些有可能 引发这个情况的系统参数后,系统报告ora-4068等错误的频率大大降低,从以前的一天几千次改变成一天出现不到10次
当然,以上是在不改变应用程序的情况下进行的,如果可以修改应用程序的话,问题的解决会顺利很多,这样的错误一般是因为应用程序编写的不太严谨而造成的。
该系统是由国家公安部统一下发的,该系统采用了大量的ORACLE包与存储过程,而且包跟过程全部都是以加密方式在数据库利保存。也就是根本不可能从应用程序方面来解决这个问题。
系统的WEBSPHERE端,所有业务逻辑全部是在JAVA包中,也是编译过的,所以针对该系统无法分析其源代码来解决这个错误,只能是针对ORACLE与WEBSPHERE服务器来解决。
通过解决这个问题也积累了大量的针对oracle 4068 4065经典错误解决方法的经验,在此做一记录,以更好的为更多出现这个错误的系统取得有效的帮助。

原文地址:https://www.cnblogs.com/huanghongbo/p/8374490.html