Увеличение нагрузки и снижение производительности при замене DBCP на Tomcat JDBC-пул
После проблем с утечкой соединения и взаимоблокировками в DBCP мы приняли решение заменить его на Tomcat JDBC-пул. Конечно, миграция была очень простой.
Но после развертывания в производственной среде я заметил, что загрузка на сервере с запуском двух Tomcats увеличивается с 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 из коробки.
Ответы
Ответ 1
Настройки и настройка отображаются правильно. Увеличение загрузки может быть результатом одновременного обращения к серверу одновременно с одновременными запросами. DBCP может помешать серверу использовать эту нагрузку из-за того, как он заблокировал пул из всех потоков. Jdbc-pool не делает этого, поэтому теперь вы увеличили свой concurrency. И если нагрузка увеличивается, ответ может уменьшаться, но ваша пропускная способность будет увеличиваться.
Я бы начал настройку
maxActive
чтобы соответствовать вашим maxThreads, чтобы обрабатывать concurrency.
Ответ 2
Ваш диагноз странный: AFAIK Tomcat DBCP lib - это просто перекомпонованная версия commons-dbcp... поэтому переход от одного к другому не должен приводить к каким-либо изменениям в поведении или производительности. (см. здесь)
Возможно, вы изменили версию (ы), которую вы используете: в частности, остерегайтесь различий 1.3/1.4. (см. здесь)
В любом случае, ваша конфигурация выглядит хорошо (и она действительно работает, несмотря на проблемы, которые могут возникнуть). Возможно, обновление ваших библиотек было единственным способом решить ваши проблемы, не входя в режим отладки...
Чтобы идти дальше, не могли бы вы уточнить, что вы подразумеваете под "проблемами с утечкой соединения и взаимоблокировками в DBCP"? Это довольно точный диагноз, чтобы определить, существует ли связь между взаимоблокировками и пулом соединений: как вы пришли к этому? Возможно, вы столкнулись с тупиковыми ситуациями, потому что ваши SQL-операторы склонны к возникновению взаимоблокировок, тогда как пул делает это возможным, предоставляя множество соединений одновременно, что фактически является его работой.