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) |
此命令的输出有点长,然而最有趣的属性是输出的开头部分:尤其是 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]) |