原文:http://www.mastertheboss.com/jboss-performance/jboss-as-7-performance-tuning/page-2
調優數據庫連接池建立與DBMS的JDBC連接過程可能是相當緩慢的。如果您的應用程序需要反覆打開和關閉數據庫連接,這可以成爲一個顯著的性能問題。在JBoss AS中數據源的連接池提供了一種有效的解決該問題的方法。
要強調的是,當客戶端關閉一個數據源的連接時,該連接返回到池中,這樣可用於其它的客戶端,因此,連接本身並沒有關閉。打開和關閉池管理的連接的成本可以以納秒來衡量,所以它對性能的影響無關緊要。
在下面的例子中,我們將強調在第三章講解的數據源配置,使用連接池配置來提供企業服務:
<datasource jndi-name="MySqlDS" pool-name="MySqlDS_Pool" enabled="true" jta="true" use-java-context="true" use-ccm="true"> <connection-url> jdbc:mysql://localhost:3306/MyDB </connection-url> <driver>mysql</driver> <pool> <min-pool-size>10</min-pool-size> <max-pool-size>30</max-pool-size> <prefill>true</prefill> </pool> <timeout> <blocking-timeout-millis>30000</blocking-timeout-millis> <idle-timeout-minutes>5</idle-timeout-minutes> </timeout> </datasource> |
在這裏,我們配置了10個連接的初始池的容量,最大可以增長到30。正如你可以從下面的MySQL管理控制檯中看到的,當你設置pre-fill元素爲true,則應用服務器試圖在啓動時預先創建連接。這可能會產生性能損失,特別是如果連接的獲取很昂貴的時候。
如果應用服務器因爲連接池的連接都在使用,而不能獲得更多的連接,那麼它會一直等待直到阻塞超時(blocking-timeout-millis),這時會拋出一個異常給客戶端。
同時,如果連接空閒超過了參數idle-timeout-minute設置的時間,則他們被迫返回到池中。
調整池大小
要確定合適的池大小,你需要監視數據庫連接的使用,這可以通過幾種方式來完成。使用命令行,您可以監視數據源的運行時性能。下面是一個將在第4章講述的應用程序的示例:
[standalone@localhost:9999 /]/subsystem=datasources/data-source="java:/MySqlDS":read-resource(include-runtime=true) |
此命令的輸出有點長,然而最有趣的屬性是輸出的開頭部分:尤其是ActiveCount,它顯示了當前活動的連接數,MaxUsedCount是由應用程序使用的連接的峯值數。
注意:如果您設置了預初始化連接池,如圖所示前面的部分,這些連接將一直處於活躍狀態。這可能造成誤解,導致你認爲他們一直很忙。
如果您無法使用CLI或只是你要好好利用你的DBA認證,有一些有效的可選方法:首先,最顯而易見的是監視數據庫會話。下表列出了一些有用的命令,這些命令可以用來跟蹤在不同數據庫上的活動的連接:
數據庫 |
命令/ 表 |
Oracle |
查詢V$SESSION視圖 |
MySQL |
使用命令SHOW FULL PROCESSLIST |
Postgre-SQL |
查詢PG_STAT_ACTIVITY表 |
另一種選擇是使用像P6Spy的工具,它充當JDBC代理的驅動。 (我博客關於它的文章在這裏))。
一旦你找到應用程序使用連接的峯值,設置至少高出25-30%作爲最大值。不要擔心設置的最大值過高,因爲如果你不需要這麼多的連接,池將自動收縮,前提是你已經設置了idle-timeout-minutes。
另一方面,服務器日誌在幫助你檢查連接池運行問題時,仍然是一個非常寶貴手段。例如,如果你在你的服務器日誌中看到這個異常,這說明你需要你去看看連接池是否正常:
21:57:57,781 ERROR [stderr] (http-executor-threads - 7) Caused by: javax.resource.ResourceException: IJ000655: No managed connections available within configured blocking timeout (30000 [ms]) |