在开始提出问题之前,我想澄清一下,我是一名数据库开发人员,对Java / J2EE方面的事情知之甚少。
我们是一个Web应用程序(带有应用程序服务器/ Web服务器的n层)。我们使用连接池来管理与数据库的连接。我对连接池的理解有限 - 应用服务器管理应用程序的连接,让应用程序从池中获取连接,一旦完成连接就返回连接池。
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),它存储了登录的用户名。我的触发器将读取用户名的全局包变量。由于连接不会保持相同(连接池管理连接),当我处理触发器时,我的全局包变量是否可用?
当多个用户登录并访问应用程序时,该变量会发生什么(显然取决于第一个问题的答案)?
我试着环顾四周,但未能清楚地回答我的怀疑。
请原谅我,如果我的问题不明确的话。让我知道,我可以编辑以提供更多信息。
答案 0 :(得分:2)
您可以使用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;
}