【问题标题】:Oracle package global variables with multiple sessionsOracle 用多个会话打包全局变量
【发布时间】:2017-03-28 11:02:44
【问题描述】:

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

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

Oracle 会话不是根据包变量隔离的吗?我需要对数据库或用户配置文件进行一些配置以确保隔离吗?

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

【问题讨论】:

  • 请检查错误:错误 9681133 ORA-6508 和/或 RAC 中有效包变量的错误结果support.oracle.com/epmos/faces/… 这可能是您的问题。顺便说一句,如果您已经解决了这个问题,请告诉我解决方案。

标签: oracle session variables jdbc package


【解决方案1】:

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

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

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

您可能想要一个全局上下文,但很难确定这一点,因为我们不知道您要使用包变量解决什么问题。

【讨论】:

  • 谢谢贾斯汀。为了正常工作,每个 jdbc 会话都必须有自己的全局变量范围,当会话之间的 glboal 变量混合时,我会得到不正确的行为和数据。连接到数据库的 java 应用程序是第三方应用程序 (Tibco),很可能启用了连接池。我会尝试与这个团队取得联系,看看他们是否能解决这个问题。及时,我可以在 oracle 中做任何其他配置来避免这种行为吗?
  • @Lucas - 理论上,您可以重新构建 Java 应用程序以不使用连接池,并在 Java 会话的整个生命周期内将 Oracle 会话分配给 Java 会话。这将大大增加您需要的 Oracle 会话数量,几乎肯定需要您在数据库服务器上使用共享服务器/MTS。但是您似乎不太可能说服编写第三方应用程序的人为您进行非常大量的重写。最有可能的是,您需要摆脱带有状态的包。
  • @JustinCave 那么解决方案是什么?我这里有一个类似的案例:[stackoverflow.com/questions/65796032/…
  • @Lucas 我试过 DBMS_SESSION.RESET_PACKAGE;但它不会清除会话,也无法弄清楚如何使用 DBMS_SESSION.CLEAR_ALL_CONTEXT
  • @SelimAlawwa - 我不确定你在问什么。在链接的问题中,您说RESET_PACKAGE 在 Oracle 中工作,但在 MySQL 中没有等效项。 RESET_PACKAGE 重置包变量。如果它没有达到您的预期,请使用可重现的测试用例创建一个新问题。如果您正在创建和使用应用程序上下文来存储状态,您将使用CLEAR_ALL_CONTEXT。您是否创建了自定义应用程序上下文?如果您希望应用程序与多个数据库一起工作,那将是非常不寻常的——上下文是非常 Oracle 的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多