Увеличение нагрузки и снижение производительности при замене 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-операторы склонны к возникновению взаимоблокировок, тогда как пул делает это возможным, предоставляя множество соединений одновременно, что фактически является его работой.