apache commons ошибка пула соединений dbcp: тайм-аут ожидания незанятого объекта в приложении Spring + Hibernate с использованием Spring Транзакции

Я прочитал различные Вопросы о потоке Stackover и содержание в Интернете по аналогичной проблеме. Однако я не смог найти полезных советов, которые позволили бы мне сузить проблему. Вот мой вариант использования, который приводит к этой ошибке.

2 объекта Кампус и Программы -> Отношение один-ко-многим из Кампуса к Программе и один к одному из Программы к Кампусу

Я пытаюсь создать несколько программ, связанных с кампусами. Каждая вставка создаст новую программу с такими же деталями и прикрепит ее к другому (уникальному) кампусу. например. Курс Java 101, предлагаемый в Нью-Йорке, Сан-Франциско, Далласе, Чикаго, создаст новую программу для каждого кампуса.

Нет проблем с сохранением единой программы. Также нет проблем с сохранением программы для 46 кампусов, но эта ошибка появляется для 47 кампуса.

Вот конфиг для моего приложения:

Файл свойств:

datasource.classname=com.mysql.jdbc.Driver
datasource.url=jdbc:mysql://localhost:3306/edu
datasource.username=xxx
datasource.password=xxx123
datasource.initialsize=15
datasource.maxactive=50
datasource.maxidle=15
datasource.minidle=5
datasource.maxwait=10000
datasource.dialect=org.hibernate.dialect.MySQLDialect
datasource.validationquery =select 1
datasource.minEvictableIdleTimeMillis = 180000
datasource.timeBetweenEvictionRunsMillis = 180000

hibernate.batchsize=30

Вот как выглядит мой весенне-спящий конфиг

<context:property-placeholder location="classpath:database.properties" order="1" ignore-unresolvable="true" />
<context:property-placeholder location="classpath:app.properties" order="2" ignore-unresolvable="true" />

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${datasource.classname}" />
    <property name="url" value="${datasource.url}" />
    <property name="username" value="${datasource.username}" />
    <property name="password" value="${datasource.password}" />
    <property name="initialSize" value="${datasource.initialsize}" />
    <property name="maxActive" value="${datasource.maxactive}" />
    <property name="maxIdle" value="${datasource.maxidle}" />
    <property name="minIdle" value="${datasource.minidle}" />
    <property name="maxWait" value="${datasource.maxwait}" />
    <property name="minEvictableIdleTimeMillis" value="${datasource.minEvictableIdleTimeMillis}" />
    <property name="timeBetweenEvictionRunsMillis" value="${datasource.timeBetweenEvictionRunsMillis}" />
    <property name="validationQuery" value="${datasource.validationquery}" />
    <property name="testOnBorrow" value="true" />
    <property name="removeAbandoned" value="true"/>
    <property name="removeAbandonedTimeout" value="60"/>
    <property name="logAbandoned" value="true"/>
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${datasource.dialect}</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.batch_size">${hibernate.batchsize}</prop>
            <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate3.SpringSessionContext</prop>

            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
            <prop key="hibernate.cache.provider_configuration_file_resource_path">/WEB-INF/ehcache-entity.xml</prop>
            <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>
            <prop key="hibernate.generate_statistics">false</prop>
            <!-- <prop key="hibernate.connection.release_mode">auto</prop> -->
        </props>
    </property>

    <property name="packagesToScan">
        <list>
            <value>com.edapp.core</value>
            <value>com.edapp.data.engine</value>
            <value>com.edapp.service.engine</value>
        </list>
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<aop:config proxy-target-class="true"/> <!-- necessary to call methods on classes than proxies -->

<context:annotation-config /> 
<context:component-scan base-package="com.edapp" />

<!-- transaction settings -->

<tx:annotation-driven transaction-manager="transactionManager" />

Вот как выглядит мой поток приложений

ProgramController -> ProgramService -> ProgramDAO

Класс обслуживания помечается: @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED)

Класс DAO помечается: @Transactional(propagation=Propagation.MANDATORY, isolation=Isolation.READ_COMMITTED)

Вот кусок из контроллера

List<String> campuses = Arrays.asList(gson.fromJson(campusesJSArray, String[].class));      
        if(campuses.size() > 0){
            List<Program> programList = new ArrayList<Program>();
            AreaOfStudy aos = this.areaOfStudyService.getById(areaOfStudyId);
            Concentration con = this.concentrationService.getById(concentrationId);
            for(String c : campuses){
                Long campusid = Long.parseLong(c);
                Program p = new Program();
                Campus campus = this.campusService.getById(campusid);
                if(campus != null){
                    System.out.println(campus.toString());
                    p.setName(name);
                    p.setCampus(campus);
                    p.setCode(code);
                    p.setLevel(level);
                    p.getCampus().getPrograms().add(p);
                    p.setAreaOfStudy(aos);
                    p.setConcentration(con);
                    p.setActive(true);
                }               
                programList.add(p);
            }
            ((ProgramServiceImpl)programService).saveOrUpdate(programList);

Вот фрагмент из службы

    if(programList == null){
        log.error("ProgramList cannot be null");
        return null;
    }

    Map<Integer, String> errors = new HashMap<Integer, String>();
    log.info("Saving program list of size:"+programList.size());

    for(int i=0; i<programList.size();i++){
        try{
            this.saveOrUpdate(programList.get(i));
        }catch(HibernateException e){
            errors.put(i, "error");
        }
    }
    return errors;

Вот фрагмент из DAO:

@Transactional(isolation=Isolation.REPEATABLE_READ)
    public void create(final T entity) {
        if(entity == null){
            IllegalArgumentException e = new IllegalArgumentException();
            throw(e);
        }
        Session session = this.sessionFactory.getCurrentSession();
        try{
            session.persist(entity);
            session.flush();
        }catch(ConstraintViolationException cve){
            log.error("School with same code already exists "+ this.clazz.getName(),cve);
            throw cve;
        }catch(HibernateException e){
            log.error("Error persisting entity of type "+ this.clazz.getName(),e);
            throw new HibernateException(e);
        }finally{
            session.clear();
        }
    }

Размер партии = 30

@Transactional(isolation=Isolation.REPEATABLE_READ)
    public void create(List<T> entityList){
        if(entityList == null){
            IllegalArgumentException e = new IllegalArgumentException();
            throw(e);
        }
        Session session = this.sessionFactory.getCurrentSession();
          try{
            for(int i=0;i<entityList.size();i++){
                T entity = entityList.get(i);

                if(entity == null){
                    log.error("List "+ this.clazz.getName() + " of cannot contain null");
                    throw new NullPointerException("List "+ this.clazz.getName() + " of cannot contain null");
                }
                session.persist(entity);
                if(i% this.batchSize == 0){
                    session.flush();
                    session.clear();
                }
            }
        }catch(HibernateException e){
            log.error("Error persisting entity of type "+ this.clazz.getName(),e);
            throw new HibernateException(e);
        }finally{
            session.flush();
            session.clear();
        }
    }

попытался использовать оба метода, чтобы сохранить, но тот же результат.


Вот полная трассировка стека

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:932)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:233)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

root cause

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection
    org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:597)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372)
    org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:329)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
    com.tr.leadgen.service.engine.CampusServiceImpl$$EnhancerByCGLIB$$68d579ad.getById(<generated>)
    com.tr.leadgen.web.edu.controllers.ProgramController.add(ProgramController.java:74)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:233)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

root cause

org.hibernate.exception.GenericJDBCException: Cannot open connection
    org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
    org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
    org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
    org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
    org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
    org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
    org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:556)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372)
    org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:329)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
    com.tr.leadgen.service.engine.CampusServiceImpl$$EnhancerByCGLIB$$68d579ad.getById(<generated>)
    com.tr.leadgen.web.edu.controllers.ProgramController.add(ProgramController.java:74)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:233)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

root cause

org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
    org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114)
    org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:83)
    org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
    org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
    org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
    org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
    org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
    org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:556)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372)
    org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:329)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
    com.tr.leadgen.service.engine.CampusServiceImpl$$EnhancerByCGLIB$$68d579ad.getById(<generated>)
    com.tr.leadgen.web.edu.controllers.ProgramController.add(ProgramController.java:74)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:233)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

root cause

java.util.NoSuchElementException: Timeout waiting for idle object
    org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1174)
    org.apache.commons.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:79)
    org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
    org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:83)
    org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
    org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
    org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
    org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
    org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
    org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:556)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372)
    org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:329)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
    com.tr.leadgen.service.engine.CampusServiceImpl$$EnhancerByCGLIB$$68d579ad.getById(<generated>)
    com.tr.leadgen.web.edu.controllers.ProgramController.add(ProgramController.java:74)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:233)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

Это единственный способ получить сессию из спящего режима:

@Transactional(propagation=Propagation.NOT_SUPPORTED)
    protected Session getCurrentSession(){
        if(this.sessionFactory == null){
            log.error("SessionFactory is null");
        }
        return this.sessionFactory.getCurrentSession();

}

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

Я был бы благодарен, если кто-нибудь может указать мне правильное направление.

3 ответа

Я вижу, что у вас был параметр пула, который проверяет соединение при заимствовании, и по трассировке стека я вижу, что эта проверка завершилась неудачно (похоже, истекло время ожидания). Есть две возможные причины, о которых я могу думать:

  1. Сетевое соединение между вашим приложением и сервером базы данных было разорвано. Это может быть связано с потерей соединения, изменением настроек брандмауэра, устаревшими записями DNS, внезапным отключением сервера БД или даже с настройкой маршрутизатора для уничтожения подозрительного сокета tcp (случалось с нами однажды)

  2. В пуле не хватает доступного соединения. Это маловероятно, потому что я предполагаю, что трассировка стека даст больше подсказок, но стоит отслеживать ваш пул и проверять количество доступных conn в момент возникновения проблемы.

Я столкнулся с подобной ошибкой сегодня.

У меня есть аналогичная настройка: "datasource.maxactive=50", что означает не более 50 подключений одновременно. У меня есть n потоков, каждый использует соединение. Когда n равно 50 или близко, это исключение случается много. Есть несколько вещей, которые можно сделать; 2, что я нашел полезным:

  • Отрегулируйте n, чтобы быть меньше
  • Повторите попытку с правильным отступлением

Из того, что я вижу, оба они дают пулу время вспомнить соединения и сокращают время ожидания.

У меня возникла та же проблема, что и при использовании приложения. Увеличен пул соединений и проблема решена.

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