JBoss AS 7性能調優(二)

原文: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)
{
"outcome" => "success",
"result" => {
"ActiveCount" => "10",
"AvailableCount" => "29",
"AverageBlockingTime" => "0",
"AverageCreationTime" => "56",
"CreatedCount" => "10",
"DestroyedCount" => "0",
"MaxCreationTime" => "320",
"MaxUsedCount" => "5",
"MaxWaitCount" => "0",
"MaxWaitTime" => "1",
. . . .
}
}

此命令的輸出有點長,然而最有趣的屬性是輸出的開頭部分:尤其是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])
21:57:57,782 ERROR [stderr] (http-executor-threads - 7)         at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.getConnection

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章