繁体   English   中英

连接池和Oracle Seesion

[英]Connection Pooling and Oracle Seesion

在开始我的问题之前,我想澄清一下我是一名数据库开发人员,并且对Java / J2EE方面的知识了解有限。

我们的是一个Web应用程序(与应用程序服务器/ Web服务器处于n层)。 我们正在使用连接池来管理与数据库的连接。 我对连接池的了解有限-App Server管理应用程序的连接,让应用程序从池中获取连接,一旦连接完成再返回到池中。

Let's say that I follow these steps - 
1. Let's say that I log in the application
2. Application requests for a connection from connection pool to authenticate me
3. Once authentication is done, App server will return the connection back to pool
4. I browse to a page where I have to do some CRUD operation and let's say that I am updating some data on the page.
5. App Server will again request for a connection from Pool
6. Application will process the data using the connection.

这是我的问题陈述-

假设我必须使用触发器(正在更新的表上)捕获审计信息。 我需要捕获的属性之一是用户名 (登录用户)。

登录时(步骤1-3),我设置了一个全局包变量,该变量存储已登录的用户名。 我的触发器将读取用户名的全局包变量。 由于连接不会保持相同(连接池管理连接),因此在处理触发器时,全局包变量是否可用?

当多个用户登录并访问应用程序时,变量将发生什么(显然取决于第一个问题的答案)?

我试图四处张望,但未能获得明确的答案。

如果我的问题不清楚,请原谅我。 让我知道,我可以进行编辑以提供更多信息。

您可以使用CLIENT_IDENTIFIER属性保留登录到应用程序的实际用户。

请从Oracle文档中找到以下更多信息:

使用客户端标识符支持应用程序用户模型

许多应用程序使用会话池来设置多个会话,以供多个应用程序用户重用。 用户向中间层应用程序进行身份验证,该中间层应用程序使用单个身份登录数据库并维护所有用户连接。 在此模型中,应用程序用户是经过应用程序中间层身份验证但数据库未知的用户。 Oracle数据库支持使用CLIENT_IDENTIFIER属性,该属性的作用类似于这些类型的应用程序的应用程序用户代理。

在此模型中,中间层在会话建立时将客户端标识符传递给数据库。 客户端标识符实际上可以是代表连接到中间层的客户端的任何内容,例如cookie或IP地址。 代表应用程序用户的客户端标识符在用户会话信息中可用,并且也可以使用应用程序上下文(通过使用USERENV命名上下文)进行访问。 这样,应用程序可以建立和重用会话,同时仍然能够在会话中跟踪应用程序用户。 应用程序可以重置客户端标识符,从而为其他用户重用会话,从而实现高性能。

您可以使用以下代码段在Java中设置CLIENT_IDENTIFIER:

public Connection prepare(Connection conn) throws SQLException { String prepSql = "{ call DBMS_SESSION.SET_IDENTIFIER('userName') }"; CallableStatement cs = conn.prepareCall(prepSql); cs.execute(); cs.close(); return conn; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM