【问题标题】:Ensure php session gets the same oracle session when using oci_pconnect确保使用 oci_pconnect 时 php 会话获得相同的 oracle 会话
【发布时间】:2012-05-19 03:22:48
【问题描述】:

我想使用全局临时表来存储一些昂贵的中间数据。数据是暂时的,但在 php 会话期间是好的,因此使用带有on commit preserve rows 的全局临时表似乎是理想的。

但是.. 看起来全局临时表数据只对创建它的 oracle 会话可用。

所以这引发了一个问题,即我如何确保 oci_pconnect 能够返回相同的 oracle 会话,因为我已经读到每个持久连接的 oracle 会话都是唯一的?我对跨多个 php 执行使用事务不感兴趣,只是临时表。

我正在使用 php 会话,因此可以将其用作选择 oracle 会话的标识符。

到目前为止,这似乎是不可能的,但问一下也无妨。

编辑: 实现此功能的预期目的是加快对我的访问控制中使用的用户组成员信息的访问速度。
提前解析组成员资格并使用此临时数据代替在所有后续查询中消除了 3 层以上的连接。 由于返回的键是 RAW,将它们序列化到外部存储会导致多次调用 HEXTORAW() 再次使用,并且似乎对预期目的没有帮助。

为确定组级访问权限而添加的查询部分在会话期间是静态的,并且自行运行会返回大约 600 行唯一的 16 字节 RAW 键。然后通过链接表将这些键与结果集连接起来,以确定用户是否对结果集具有任何“组级别”权限。

我玩过使用 IN 并将键作为字符串传递,但由于它们是 RAW 键,因此我必须每次查询调用 HEXTORAW() 600 次。性能不如使用临时表和执行JOIN 好。

有没有其他方法可以告诉 Oracle 将查询的那部分结果缓存起来,而不是将它们写入“永久”中间结果?

【问题讨论】:

    标签: php oracle session persistent-connection


    【解决方案1】:

    尽管您可能会想出一些技巧来完成这项工作,但至少在某些时候,我认为这几乎肯定会在某些时候引起问题,尤其是在从开发服务器进行过渡时到生产服务器。选项可能包括:

    1. 使用永久表,并在逻辑完成后清除数据。
    2. 将数据写入平面文件,然后在需要时将其读回。
    3. 将数据写入平面文件,然后将该文件挂载为外部表。

    分享和享受。

    【讨论】:

    • 对于我的预期用途,看起来我可能坚持使用#1。
    【解决方案2】:

    “数据库常驻连接池”怎么样。我想这就是你要找的。试一试!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 2016-10-02
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      相关资源
      最近更新 更多