2015-12-10 73 views
2

我正在研究數據庫連接池。我可以看到使用應用程序服務器端創建連接池的各種選項,然後查看JNDI,hibernate連接池,在其中可以在配置文件中設置屬性。用java連接池更好的方法

我有2個問題。

  1. 我已經設置的屬性如下

    hibernate.c3p0.max_size=20 (Max number of database connections to open) 
    

    如果有100個用戶訪問我的網站,我只指定20連接的對象會發生什麼。剩餘的80位用戶是否會等待20位用戶完成他們的交易,或剩餘80位用戶可以連接到應用程序?

  2. 這是連接池使用hibernate配置或通過應用服務器端更好的方法?

在此先感謝。

回答

0

創建連接時描述了連接創建部分。它描述了幾個Context實例如何共享同一個連接。 在這種共享中,來自不同上下文實例的操作被複用到相同的連接上。 您可以通過決定何時創建新的初始上下文以及何時從現有上下文實例獲取派生上下文實例來控制共享程度。 這種類型的連接共享滿足大多數應用程序。

https://docs.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html

連接池是在數據源實現,並且在這兩種情況下,Hibernate將使用一個數據源。 您可以將數據源指定並配置到休眠配置中 您可以在應用程序中配置數據源。服務器,並在休眠配置中指定相應的JNDI名稱。 在這種情況下,您可以使用隨應用程序一起提供的數據源實現。服務器。

對於數量的聯合讓我們舉個例子,讓我們以每秒100個交易爲例。假設每個前端(瀏覽器)tx花費0.5秒到 完成,並在0.5秒內花費0.25美元在數據庫中。 因此,您需要在數據庫連接池中使用0.5 * 100或100個連接,並在數據庫連接池中使用0.25 * 100 = 25個連接。

爲了安全起見,我會將最大線程池大小設置爲至少比預期的大25%,以便允許負載峯值。 最小值可以是最大值的一小部分,但折衷是對於某些用戶可能需要更長的時間,因爲創建新連接必須是 。在這種情況下,50-100個連接對於一個DB來說並不是那麼多,所以這可能是一個很好的起始數字。

請注意,爲了弄清楚您的平均交易響應時間以及您的平均數據庫查詢時間,您將不得不做一次性能測試,因爲您的負載時間可能不會是時間你看到一個用戶。

當您需要同時限制應用程序中運行的線程數時,線程池非常有用。 假設您的數據庫最多可以支持25個連接,那麼直接將連接池最大屬性配置爲25.但是,該設置將如何影響線程池設置?將應用程序服務器線程池配置爲最多50個。在此場景中,應用程序服務器將允許同時處理50個請求,但數據庫只有25個連接。因此,只有25個線程會獲得連接,另外25個線程將​​爭奪數據庫連接,因此連接會頻繁地在線程之間切換,從而降低整體應用程序的性能。 假設我們將線程池的最大設置設置爲與連接池最大設置爲50相同。應用程序服務器將允許同時處理50個線程,其餘線程將處於等待狀態。所有50個線程都會立即獲得數據庫連接,因此它將被快速處理。 上面的例子假定每個線程將使用一個數據庫連接(可能是多個連接,但依次);如果您的應用程序每個線程並行使用兩個數據庫連接,則將線程池最大設置配置爲連接池最大值的一半。 最後,將線程池大小設置過大可能會導致性能問題,因爲如果線程數太多,任務切換開銷將成爲嚴重的瓶頸。

+0

謝謝@Zia。這裏有點混亂。線程池中有0.5 * 100或100個連接,DB連接池中有0.25 * 100 = 25個連接。什麼是線程池和數據庫連接池? –

+0

這是一個具有生命週期的工作線程池,如下所示: 1.獲取要執行的新任務 2.執行它 3.返回到等待下一個任務 – Zia

+0

@Anil varma我更新了我的答案,請查找我希望你能得到清晰的圖片 – Zia