2010-05-18 86 views
3

最近我參加了在Java面試,面試官問類似下面一個問題:理想情況下我必須打開多少個連接?

我有去throgh A,B,C模塊和響應回去throgh一個請求,在模塊AI需要跟數據庫再次在模塊CI中需要與數據庫交談,所以在這種情況下您將打開多少個連接,以及您在哪裏關閉這些連接?

我的答案:我說在模塊AI中會打開一個連接,然後我將它關閉,然後控制轉到模塊B,然後模塊C,再次在模塊C中打開一個連接,然後我將關閉它再次。然後他又問我另一個問題,我想打開每個請求處理一個連接,我該怎麼做?

+0

連接是否應該是單線程?模塊C可以獨立提交/回滾嗎? – Uri 2010-05-18 19:32:29

+0

如果您獲得1000請求,則不應創建超過1000個到數據庫的連接,您應該只創建<= 1000個連接。所以在這種情況下,單個線程概念如何來到這裏,我不知道它。你可以詳細說明你的意思是什麼「單線程」 模塊C可以獨立提交/回滾 – Ranjith 2010-05-18 19:41:03

+0

@ Ranjith-kumar-u有一種機制可以在一個線程中共享「數據」,這就是Thread-local是關於。您可以將連接存儲在那裏,並讓任何人使用它在同一個線程中。 – OscarRyz 2010-05-18 19:43:56

回答

4

共享的模塊的連接。

編輯 您可以通過它傳遞給不同的模塊共享的連接:

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); 
    } 
} 
+0

如何做到這一點?我不應該在這裏使用任何連接池技術。 – Ranjith 2010-05-18 19:29:44

+0

聽起來像一個設計模式。有沒有這個名字? – Pretzel 2010-05-18 19:30:45

+0

存儲庫模式? – Pretzel 2010-05-18 19:37:35

1

例如,通過使用像Hibernate的ORM解決方案,可以保持當前會議(這是排序更高層次的Hibernate等值連接的)在整個請求生命週期開放,並在所有使用它模塊。

3

我猜他一直在尋找的答案是使用一個ThreadLocal並在請求結束的過濾器終止它,但它是艱難的決定在沒有詢問架構更多的問題「最好」的解決方案所述模塊區域包裹起來(甚至在字模塊的上下文中的含義。)

0

「我理想的情況下多少個連接都開?」

它非常簡單,每個請求打開一個連接(不管多少模塊經過),然後關閉連接請求完成時。

「然後他問我再次另一個問題,我想打開每請求處理一個連接,我怎麼能這樣做呢?」

請打開被處理的請求之前的連接,並關閉後的過濾器(請求攔截器)。保持連接在一個靜態的ThreadLocal實例中,以便它可以在當前線程中共享。不要使用簡單的靜態連接,否則它將在所有線程中共享併產生不希望的結果。