2013-03-01 72 views
1

數據庫連接是得到像下面來自用戶的每個請求調用一個新的getConnection()?

public Connection getDBConection(){ 
    Context context = new InitialContext(); 
    DataSource dataSource = (javax.sql.DataSource) context.lookup("java:myDataSource"); 
    Connection conn = dataSource.getConnection(); 
} 

對於用戶A,是每個數據庫請求應該叫getDBConnection()一次;但不需要控制所有的請求使用相同的連接?

也就是說,如果userA有三個數據庫請求,那麼userA應該調用getDBConnection()三次,並且在每個請求中使用後調用Connection.closed()

如果用戶A撥打getDBConnection()三次(即撥打dataSource.getConnection()三次),是否建立了三個連接?或者它是未知的,並由weblogic控制?

我感到非常混亂,對於一個數據庫請求應該有一個新的連接是真的嗎?或者只需爲每個數據庫請求調用DataSource.getConnection(),並且創建的新連接數由Web服務器控制,無需考慮實際創建的連接數。

回答

3

每當您撥打DataSource.getConnection時,數據源都會爲您檢索連接。應該是真的,返回的連接沒有被任何人積極使用,但它不一定是一個全新的連接。

例如,如果您使用連接池,這是非常普遍的做法,那麼當您撥打Connection.close時,連接並未實際關閉,而是返回到可用連接池。然後,當您撥打DataSource.getConnection時,連接池將查看是否有任何備用連接處於尚未分配的位置。如果是這樣,它通常會測試它們沒有失效(通常通過對虛擬表執行非常快速的查詢)。如果沒有,它會將現有的連接返回給調用者。但是如果連接過時,那麼連接池將從底層數據庫驅動程序中檢索一個真正的新連接,然後返回該連接。

通常情況下,連接池在任何時候都會保留最大數量的實際連接(例如50)。如果您的應用程序試圖請求超過50個同時連接,則DataSource.getConnection將引發異常。或者在一些實現中,它將阻塞一段時間直到一個變爲可用,然後在該時間過期後拋出異常。有關示例實現,請參閱Apache Commons DBCP

希望能回答你的問題!

+0

然後如果userA有三個不同的數據庫請求,他應該調用DataSource.getConnection()三次,然後調用Connection.close()三次,對吧? 這對於使用相同的連接來處理三個數據庫請求並不好(對於三次不同的數據庫請求,只調用一次DataSource.getConnection(),對嗎?) 我問過這個問題,因爲有時我看到創建連接時間是沉重且需要緩存該連接,但實際上,這已經由JDBC drvier完成了,無需由應用程序開發人員進行處理? – user1169587 2013-03-01 16:59:09

+0

如果你有三個不同的數據庫請求,並且它們應該一個接一個地執行(即不是由三個不同的線程中的三個不同的用戶),那麼通過一切手段,我將使用相同的'Connection'執行它們。我不會依賴以特定方式配置您的數據源。 – 2013-03-01 17:45:53

相關問題