Oracle使用多个会话打包全局变量

时间:2016-11-14 18:02:28

标签: oracle session variables jdbc package

我有一个带有一些全局变量的Oracle包,它们被初始化并用于该包的所有过程。

当我调用这些过程时(通过jdbc连接和调用),全局变量被正确初始化,并且它们的值会持续通过打开的数据库会话上的所有过程,但是当我有多个jdbc连接时,似乎全局变量值在电话之间混合。

根据包变量,Oracle会话是否被隔离?我是否需要在数据库或用户配置文件上进行一些配置以保证隔离?

我的数据库实例位于具有2个节点的RAC中。

1 个答案:

答案 0 :(得分:1)

每个数据库会话都有自己的一组变量,是的。

我希望您的Java应用程序使用连接池,以便您的Java应用程序不断从池中获取连接并将它们返回到池中。如果是这种情况,则Java会话和Oracle会话之间没有关系。特定的Java会话可能使用Oracle会话A进行第一次呼叫,使用Oracle会话B进行第二次呼叫,使用C进行第三次呼叫,再次使用B进行第四次呼叫。其他会话也会做同样的事情,因此会话B的状态可能在两次调用之间发生了变化,因为其他一些Java会话在过渡期间使用了它。

当会话返回到池时,某些连接池实现会明确地清除包变量,以便数据不会从一个会话泄漏到另一个会话。其他实现将允许不同的Java会话在先前调用的任何状态下查看包变量。在任何一种情况下,将包中的状态维护为企业Java应用程序的一部分都是一个坏主意。

您可能希望使用全局上下文,但很难确定这一点,因为我们不知道您尝试使用包变量解决了哪些问题。