2016-05-19 2 views
0

Пытается отладить приложение, имеющее аналогичную проблему, как Missing connections in tomcat jdbc connection pool. Я в настоящее время использую:Пул подключения Tomcat/Spring - список соединений.

  • Tomcat 6.0.32 - Требование о компании
  • Tomcat JDBC Pool 1.0.9.3
  • Java 1.6.x - Требование Компании
  • Spring 3.2.14
  • myBatis 3.2.8
  • Кварц 2.2.2

Существует смесь Spring Web запросов как дост l, поскольку Quartz запускал задания с использованием пула. Что происходит после примерно 5 запусков, у меня больше нет доступных подключений в пуле, initialSize = 5, maxActive = 10. Увеличение maxActive ничего не делает, это просто занимает больше времени, и больше Quartz работает до пула пуст.

2016-05-19 08:59:46,027 DEBUG org.springframework.scheduling.quartz.SchedulerFactoryBean#0_QuartzSchedulerThread QuartzSchedulerThread.run 276 : batch acquisition of 1 triggers 
2016-05-19 09:00:00,001 DEBUG org.springframework.scheduling.quartz.SchedulerFactoryBean#0_QuartzSchedulerThread QuartzSchedulerThread.run 276 : batch acquisition of 0 triggers 
2016-05-19 09:00:00,003 DEBUG org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6 JobRunShell.run 201 : Calling execute on job DEFAULT.refMigrDetail 
2016-05-19 09:00:00,003 DEBUG org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6 DataSourceUtils.doGetConnection 110 : Fetching JDBC Connection from DataSource 
2016-05-19 09:00:24,409 DEBUG org.springframework.scheduling.quartz.SchedulerFactoryBean#0_QuartzSchedulerThread QuartzSchedulerThread.run 276 : batch acquisition of 0 triggers 
2016-05-19 09:00:30,004 ERROR org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6 CMRoreReferenceMigrator.run 93 : org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none available[10 in use]. 
2016-05-19 09:00:49,378 DEBUG org.springframework.scheduling.quartz.SchedulerFactoryBean#0_QuartzSchedulerThread QuartzSchedulerThread.run 276 : batch acquisition of 0 triggers 

Что я сделал до сих пор:

  • Switched от Apache Commons ГСБД в Tomcat JDBC пула. Это работает.
  • Включено DEBUG для Tomcat JDBC Pool. Также работает
  • Включено JMX на Tomcat для мониторинга пула соединений с jvisualvm - это НЕ работало, поскольку Spring фактически создает пул, а не Tomcat.

С включенным DEBUG для пула Tomcat JDBC журнал регистрации не показывает, где/почему соединения НЕ выпускаются. Для маршрута JMX, поскольку я НЕ использую Spring-Boot, я не могу включить JMX в Spring, чтобы увидеть пул соединений.

Мой вопрос в том, есть ли способ захватить объект/экземпляр пула Spring Connection Connection из SPRING (а не Tomcat), а затем перебрать его для всех соединений и перечислить некоторые простые свойства для каждого соединения, такие как активные, использование, закрытие и т. д.

Моя мысль, что я просто пишу код Java, который выгружает список пулов соединений в журнал до и после задания Quartz. Сбрасывает список в ключевых транзакциях Spring Web, которые я использую в веб-приложении до и после.

Моя конфигурация пула Пружинное соединение, базы данных DB2:

<bean id="rrfecfDataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> 
    <property name="driverClassName" value="${rrfecf.datasource.jdbcDriver}" /> 
    <property name="url" value="${rrfecf.dataousrce.databaseUrl}" /> 
    <property name="username" value="${rrfecf.datasource.username}" /> 
    <property name="password" value="${password:rrfecf.datasource}" /> 
    <property name="initialSize" value="5" /> 
    <property name="maxActive" value="10" /> 
    <property name="defaultAutoCommit" value="false" /> 
    <property name="maxIdle" value="5" /> 
    <property name="minIdle" value="0" /> 
    <property name="testOnBorrow" value="true" /> 
    <property name="testOnReturn" value="false" /> 
    <property name="testWhileIdle" value="true" /> 
    <property name="validationQuery" value="SELECT CURRENT_DATE FROM sysibm.sysdummy1" /> 
    <property name="timeBetweenEvictionRunsMillis" value="600000" /> <!-- 10 minutes --> 
    <property name="minEvictableIdleTimeMillis" value="900000" /> <!-- 15 minutes --> 
</bean> 

myBatis конфигурации Spring:

<bean id="rrfecfSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="configLocation" value="WEB-INF/sqlMapConfig.xml"/> 
    <property name="dataSource" ref="rrfecfDataSource" /> 
</bean> 

ответ

-1

Это 'кажется', чтобы работать, не уверен, что есть лучший способ:

  • Сделано в приложенииContextAware Bean весной.
  • Проводной компонент ApplicationContextAware для классов кварца.
  • В классах Quartz Я:
    • Использование ApplicationContextAware Bean, чтобы получить ConnectionPool.
    • Используя цикл для перебора через все соединения и выливать свойства

класс ApplicationContextAware:

import org.apache.tomcat.jdbc.pool.DataSource; 
import org.springframework.beans.BeansException; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationContextAware; 

/** 
* <p> 
* The <code>BatchApplicationContextProvider</code> provides... 
* </p> 
*/ 

public class BatchApplicationContextProvider implements ApplicationContextAware { 

    public static final String ID    = BatchApplicationContextProvider.class.getName(); 
    private String    SHORT_NAME  = "BatchApplicationContextProvider()"; 
    @SuppressWarnings("unused") 
    private String    SYSTEM_IDENTITY = String.valueOf (System.identityHashCode (this)); 

    private ApplicationContext context; 

    /** 
    * 
    */ 
    public BatchApplicationContextProvider() { 
     // TODO Auto-generated constructor stub 
    } 

    /* (non-Javadoc) 
    * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) 
    */ 
    @Override 
    public void setApplicationContext(ApplicationContext arg0) 
     throws BeansException { 
     this.context = arg0; 
    } 

    public ApplicationContext getApplicationContext() { 
     return context; 
    } 

    public org.apache.tomcat.jdbc.pool.DataSource getConnectionPool() { 
     return (DataSource) this.context.getBean ("rrfecfDataSource"); 
    } 

} 

Пример использования:

public void  dumpConnectionPool() { 
    org.apache.tomcat.jdbc.pool.DataSource lthePool = null; 
    ConnectionPool lbusyPool = null; 
    try { 
     lthePool = getBatchContext().getConnectionPool(); 
     lbusyPool = lthePool.getPool(); 
     if (lbusyPool != null) { 
      if (lbusyPool.getSize() > 0) { 
       getLog().info (SHORT_NAME + ".run() - ConnectionPool - size....................[" + lbusyPool.getSize() + "] idle [" + lbusyPool.getIdle() + "] active [" + lbusyPool.getActive() + "]" ); 
       //getLog().info (SHORT_NAME + ".run() - ConnectionPool - idle....................[" + lbusyPool.getIdle() + "]"); 
       //getLog().info (SHORT_NAME + ".run() - ConnectionPool - active..................[" + lbusyPool.getActive() + "]"); 
       //PoolConfiguration  lpoolCfg = lbusyPool.getPoolProperties(); 
      } 
     } 

     lbusyPool = null; 
     lthePool = null; 

    } 
    catch (Exception ltheXcp) { 
     log.error (ltheXcp); 
    } 
    finally { 

    } 


} 

Я надеюсь, у кого-то есть более элегантный способ ... для меня это кажется грубой силой, но мне нужно решить эту проблему ue в веб-приложении на данный момент.

EDIT: Возникла проблема с dumpConnectionPool() ... цикл for, по-видимому, зависает на всех соединениях, когда он выполняет итерацию, делая их «активными». Работа над этим ...

РЕДАКТИРОВАТЬ: Извлечь петлю for ... установка соединения = null не выводит его обратно в пул соединений.

УСПЕХ:

Пока не очень, то dumpConnectionPool() показывает этот вопрос проявляется:

dumpConnectionPool() перед запуском Кварц, показывает 5 простаивает, 0 активен:

2016-05-20 11:20:00,078 INFO org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-2 RunReferenceMigrator.run 138 : ----------------------------------------------------------------------------------------------------------------- 
2016-05-20 11:20:00,078 INFO org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-2 RunReferenceMigrator.dumpConnectionPool 257 : RunReferenceMigrator().run() - ConnectionPool - size....................[5] idle [5] active [0] 
2016-05-20 11:20:00,078 INFO org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-2 RunReferenceMigrator.run 140 : ----------------------------------------------------------------------------------------------------------------- 

dumpConnectionPool() после запуска кварца, показывает 4 холостого хода, 1 активна:

2016-05-20 11:24:45,063 INFO org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-2 RunReferenceMigrator.run 161 : ----------------------------------------------------------------------------------------------------------------- 
2016-05-20 11:24:45,063 INFO org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-2 RunReferenceMigrator.dumpConnectionPool 257 : RunReferenceMigrator().run() - ConnectionPool - size....................[5] idle [4] active [1] 
2016-05-20 11:24:45,063 INFO org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-2 RunReferenceMigrator.run 163 : ----------------------------------------------------------------------------------------------------------------- 
Смежные вопросы