【发布时间】:2012-11-24 08:09:03
【问题描述】:
在 DBCP 中出现连接泄漏和死锁问题后,我们决定将其替换为 Tomcat JDBC 池。当然,迁移真的很简单。
但在将其部署到生产环境后,我注意到运行两个 Tomcat 的服务器上的负载从 4-4.5 增加到 5.5。除了更换游泳池外,我们没有再做任何事情。此外,使用 JMeter 测量的性能下降了约 5%。
我花了一些时间调整池参数,但没有明显的效果。我在下面粘贴了我当前的配置(来自<GlobalNamingResources> 中的server.xml):
<Resource name="jdbc/xxxxxx"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
initialSize="10"
maxActive="100"
minIdle="10"
maxIdle="50"
maxWait="10000"
testOnBorrow="true"
testOnReturn="false"
testOnConnect="false"
testWhileIdle="false"
validationQuery="SELECT 1 from dual"
validationInterval="30000"
suspectTimeout="60"
timeBetweenEvictionRunsMillis="30000"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
abandonWhenPercentageFull="50"
minEvictableIdleTimeMillis="60000"
jmxEnabled="true"
username="xxxxx"
password="xxxxx"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:oci:xxxxx"/>
FairQueue 和 PoolSweeperEnabled 为真
在 Spring applicationContext-jdbc.xml 我只有:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="resourceRef">
<value>true</value>
</property>
<property name="jndiName">
<value>java:comp/env/jdbc/PortalDB</value>
</property>
</bean>
我做错了什么?我认为 JDBC_pool 应该比开箱即用的 DBCP 更快。
【问题讨论】:
-
尝试 testWhenIdle="true",并尝试将 maxActive 的数量从 100 减少到 20 左右。可能池中的连接过多会减慢速度。
-
你使用的验证查询和以前一样吗?
-
@rootkit007 - 不,使用 dbcp 我没有使用 ant 验证查询。
-
尝试一个不访问数据库的验证查询。一些 SQL 服务器很古怪,但通常像“选择真”这样的东西就可以正常工作,并且不涉及访问任何表
-
你可能不应该
testOnBorrow- 这太贵了,试试testOnReturn。
标签: performance tomcat load apache-commons-dbcp jdbc-pool