确保 php 会话在使用 oci_pconnect 时获得相同的预言机会话


Ensure php session gets the same oracle session when using oci_pconnect

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

但是......看起来全局临时表数据仅适用于创建它的预言机会话。

因此,这就提出了一个问题,即我如何确保oci_pconnect将返回相同的预言机会话,因为我已经读到预言机会话在每个持久连接中都是唯一的? 我对跨多个 php 执行使用事务不感兴趣,只对临时表感兴趣。

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

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

编辑:实现此目的的预期目的是加快对我的访问控制中使用的用户组成员身份信息的访问。
提前分析组成员身份并使用此临时数据会消除所有后续查询中的 3 + 层联接。由于返回的密钥是RAW的,将它们序列化到外部存储会导致许多调用HEXTORAW()再次使用,并且似乎无助于达到预期目的。

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

我尝试使用 IN 并将键作为字符串传入,但由于它们是 RAW 键,因此我必须为每个查询调用HEXTORAW() 600 次。 性能远不如使用临时表和做JOIN

有没有其他方法可以告诉 Oracle 保留缓存的该部分查询的结果,而不是将它们写入"永久"中介结果?

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

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

分享和享受。

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