Увеличение нагрузки и снижение производительности при замене DBCP на Tomcat JDBC-пул

После проблем с утечкой соединения и взаимоблокировками в DBCP мы приняли решение заменить его на JDBC-пул Tomcat. Конечно, миграция была действительно простой.

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

2 ответа

Ваши настройки и настройки отображаются правильно. Увеличение нагрузки может быть связано с одновременной обработкой сервером большего количества одновременных запросов. Возможно, DBCP не позволил серверу принять на себя эту нагрузку из-за того, что он заблокировал пул из всех потоков. Jdbc-pool этого не делает, так что теперь вы увеличили свой параллелизм. А если нагрузка возрастет, отклик может уменьшиться, но ваша пропускная способность увеличится.

Я бы начал тюнинг

maxActive

чтобы соответствовать вашим maxThreads для обработки параллелизма.

Ваш диагноз странный: AFAIK Tomcat DBCP lib - это просто перепакованная версия commons-dbcp... поэтому переход с одного на другой не должен приводить к каким-либо изменениям в поведении или производительности. (см. здесь)

Что может измениться, хотя это версия (ы), которую вы используете: в частности, остерегайтесь различий 1.3/1.4. (см. здесь)

В любом случае, ваша конфигурация в порядке (и она действительно работает, несмотря на проблемы, с которыми вы можете столкнуться). Обновление ваших библиотек было, вероятно, единственным способом решения ваших проблем без входа в режим отладки...

Чтобы пойти дальше, не могли бы вы более конкретно сказать, что вы подразумеваете под "проблемами с утечкой соединения и взаимоблокировками в DBCP"? Это довольно точный диагноз, чтобы определить, существует ли связь между взаимоблокировками и пулом соединений: как вы к этому пришли? Вы можете столкнуться с взаимоблокировками, потому что ваши операторы SQL склонны к возникновению взаимоблокировок, тогда как пул делает это возможным только путем одновременного предоставления большого количества соединений, что на самом деле является его работой.

Другие вопросы по тегам