最近我參加了在Java面試,面試官問類似下面一個問題:理想情況下我必須打開多少個連接?
我有去throgh A,B,C模塊和響應回去throgh一個請求,在模塊AI需要跟數據庫再次在模塊CI中需要與數據庫交談,所以在這種情況下您將打開多少個連接,以及您在哪裏關閉這些連接?
我的答案:我說在模塊AI中會打開一個連接,然後我將它關閉,然後控制轉到模塊B,然後模塊C,再次在模塊C中打開一個連接,然後我將關閉它再次。然後他又問我另一個問題,我想打開每個請求處理一個連接,我該怎麼做?
最近我參加了在Java面試,面試官問類似下面一個問題:理想情況下我必須打開多少個連接?
我有去throgh A,B,C模塊和響應回去throgh一個請求,在模塊AI需要跟數據庫再次在模塊CI中需要與數據庫交談,所以在這種情況下您將打開多少個連接,以及您在哪裏關閉這些連接?
我的答案:我說在模塊AI中會打開一個連接,然後我將它關閉,然後控制轉到模塊B,然後模塊C,再次在模塊C中打開一個連接,然後我將關閉它再次。然後他又問我另一個問題,我想打開每個請求處理一個連接,我該怎麼做?
共享的模塊的連接。
編輯 您可以通過它傳遞給不同的模塊共享的連接:
class ModuleA {
void process(){
Connection c = getConnection();
doA();
new ModuleB(c).doBs();
new ModuleC(c).doCs();
doSomeMoreA();
c.close();
}
}
您也可以在外部類的連接,並在需要時進行搜索(也許使用一個會話ID)
我不知道這是否算作「連接池」
這裏反正就是這樣。
class Db {
private static Map<Integer, Connection> map;
public static Connection getConnection(int sessionId){
if(!map.containsKey(sessionId)) {
map.put(sessionId, createConnection());
}
return map.get(sessionId);
}
}
class Main {
void processs() {
int sessionId = createSesionId();
ModuleA a = new ModuleA(sessionId);
a.doAsStuff();
ModuleB b = new ModuleB(sessionId);
b.doBsStuff();
ModuleC c = new ModuleC(sessionId);
b.doCsStuff();
a.closeTransaction();
}
}
class ModuleA{
public doAsStuff() {
Connection c = Db.getConnection(sessionId);
doSomethingWith(c);
}
public closeTransaction() {
Connection c = Db.getConnection(sessionId);
c.close();
}
}
class ModuleB{
public doBsStuff() {
Connection c = Db.getConnection(sessionId);
doSomethingWith(c);
}
}
class ModuleC{
public doCsStuff() {
Connection c = Db.getConnection(sessionId);
doSomethingWith(c);
}
}
例如,通過使用像Hibernate的ORM解決方案,可以保持當前會議(這是排序更高層次的Hibernate等值連接的)在整個請求生命週期開放,並在所有使用它模塊。
使用一個數據庫連接池,比如Apache DBCP http://commons.apache.org/dbcp/
我不應該在這裏使用任何連接池技術。 – Ranjith 2010-05-18 19:33:10
我猜他一直在尋找的答案是使用一個ThreadLocal
並在請求結束的過濾器終止它,但它是艱難的決定在沒有詢問架構更多的問題「最好」的解決方案所述模塊區域包裹起來(甚至在字模塊的上下文中的含義。)
「我理想的情況下多少個連接都開?」
它非常簡單,每個請求打開一個連接(不管多少模塊經過),然後關閉連接請求完成時。
「然後他問我再次另一個問題,我想打開每請求處理一個連接,我怎麼能這樣做呢?」
請打開被處理的請求之前的連接,並關閉後的過濾器(請求攔截器)。保持連接在一個靜態的ThreadLocal實例中,以便它可以在當前線程中共享。不要使用簡單的靜態連接,否則它將在所有線程中共享併產生不希望的結果。
連接是否應該是單線程?模塊C可以獨立提交/回滾嗎? – Uri 2010-05-18 19:32:29
如果您獲得1000請求,則不應創建超過1000個到數據庫的連接,您應該只創建<= 1000個連接。所以在這種情況下,單個線程概念如何來到這裏,我不知道它。你可以詳細說明你的意思是什麼「單線程」 模塊C可以獨立提交/回滾 – Ranjith 2010-05-18 19:41:03
@ Ranjith-kumar-u有一種機制可以在一個線程中共享「數據」,這就是Thread-local是關於。您可以將連接存儲在那裏,並讓任何人使用它在同一個線程中。 – OscarRyz 2010-05-18 19:43:56