2013-08-28 50 views
1

我碰到這個面試問題就來了:你將如何管理一個數據庫連接池? 我的想法是: 我將創建一個ArrayBlockingQueue<Connection>,來創建連接對象,並把它們放在隊列時ajvm啓動。然後用某種形式的enum單例包裝它,這樣只有一個這樣的隊列,並且它在JVM的生命週期中保持活動狀態。如何管理一個自定義的數據庫連接池

然後使用某種工具/驅動程序類,將採取從隊列連接,並退回他們回到隊列。

我想我需要說這個還有什麼?我是否需要使隊列線程安全,以便多個請求不具有相同的連接?

+0

你應該有一個線程來監視數據庫連接(它們是否關閉並打開新的連接) – anfy2002us

+0

你是指uility/driver class是什麼意思? – LoveMeow

回答

0

在我opninion你在這裏失蹤幾點:

  1. 連接應該返回回池中時,返回到初始狀態。例如,connection.setAutocommit(...);應該一定還原

  2. 我不是一個好主意,將原生連接包裝到您自己的javax.sql.Connection接口實現中,以控制和監視在連接上執行的操作。使用這種模式,你也可以實現一個有價值的功能:在close()返回連接池。調用

  3. 你需要一些menans控制在根據實際池的利用率池的連接數。看看如何「能力」和「負載因子」在Java集合實現得到一個粗略的實現思路,如果他們還活着

  4. 連接進行監控。對所有可能的數據庫進行歸檔並不容易。

+0

Thnaks ...如何確保兩個線程之間不共享相同的連接? – Victor

+0

也許在包裝類,我有一個getInstance(連接con)方法,我讓這個方法同步?但是,這是我認爲不好的表現 – Victor

+1

使這些方法同步並不會節省您的時間。如果要控制訪問連接的線程,請考慮每次調用封裝類時檢查線程ID。如果id與以前記錄的擁有者線程ID不同,則可以拋出異常。你可以得到id或當前線程爲Thread.currentThread()。getId(); – Jk1