簡體   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