java JBoss AS 7性能调优(二)

调优数据库连接池

建立与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章讲述的应用程序的示例:

[[email protected]: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
作者:wilbertzhou 发表于2014-5-3 21:19:02 原文链接

Tagged:

Comments are closed.