ORA-04068: existing state of packages has been discarded
出现该错误时,意味着package有被重新编译,旧状态的包已被丢弃,包有新的状态产生。
产生原因
在上游程序(如Java中MyBatis数据库连接池)运行过程中,如果对Oracle有状态(即定义了全局变量)的Package重新编译,将会导致上游程序获取该packge的会话状态失效。
因为有状态的package每次编译都会产生新的副本,会导致引用旧副本的连接池无法正确调用package。
问题表现形式
- 使用Java数据库框架MyBatis进行Sql编写,当调用Oracle程序包时,间或提示该错误,一旦重启Java程序后又能正常返回结果。
- 使用sqldeveloper oracle可视化操作工具时,间或出现ORA-04068错误,重新执行后又能正常返回结果。
解决思路
- 避免在package中使用全局变量,即可保证package是无状态的。(推荐)
- 针对执行sql的异常捕获,当出现捕获ORA-04068错误时,重置连接池后再执行sql。(不推荐,在实在无法改造package的情形下才考虑。)