这会导致问题,因为我们的程序使用基于会话的全局临时表;需要这个有充分理由。一个Web客户端的操作会干扰另一个Web客户端的操作。为什么单独的客户端重用相同的Oracle会话。
存在与Web逻辑的连接池。我打印了以下内容以确认确实为2个客户端分配了相同的oracle会话。
SELECT SYS_CONTEXT ('USERENV', 'INSTANCE'),
SYS_CONTEXT ('USERENV', 'SID'),
SYS_CONTEXT ('USERENV', 'SESSIONID')
FROM DUAL;
如何确保每个客户端获得不同的会话(不是HTTP会话,而是Oracle会话)?这是Weblogic级别需要修改的吗?
答案 0 :(得分:2)
如果您在中间层使用连接池,那么一旦您的中间层代码关闭连接,它就会返回到池中,并可供另一个中间层会话使用。如果您尝试使用全局临时表来存储数据超过中间层关闭连接的点,那么您做错了。
您可以设计和构建中间层,以便它不使用连接池,以便每个中间层会话打开仅由该用户使用的专用数据库连接。然而,这通常是一个可怕的想法,因为您通常会花费大量时间来打开和关闭数据库连接,当应用程序用户只是导航离开站点而不是明确地导航时,您最终会遇到数千个孤立的数据库连接注销,在不同的时间点为不同的应用服务器提供相同的用户服务,以实现负载平衡,这将变得非常困难。
更好的方法是删除全局临时表,并在永久表中存储您需要的任何数据,该表包含您的唯一会话ID作为密钥的一部分。您需要编写代码以在某些时候清除数据,但这不应该非常困难。