Spring Boot с Hibernate и конфигом C3P0.Пул соединений исчерпан (Oracle 10g Диалект) - PullRequest
0 голосов
/ 28 мая 2018
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="DataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
            <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
            <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
            <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
            <prop key="org.hibernate.cache.ehcache.configurationResourceName">classpath:hibernate-ehcache.xml</prop>
            <prop key="cache.provider_class">${cache.provider_class}</prop>
            <prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop>
            <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
        </props>

    </property>
</bean>

<!-- Hibernate template for hibernateSessionFactory -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<!-- Transaction Manager for hibernateSessionFactory -->

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

Выше находится конфигурация Hibernate для приложения с весенней загрузкой.Мы добавили следующий конфиг c3po.Но все равно пул подключений максимально загружен.

    <bean id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverClassName}"></property name>
    <property name="jdbcUrl" value="${ondot.jdbc.url}"></property name>
    <property name="user" value="${jdbc.user}"></property name>
    <property name="password" value="${jdbc.password}"></property name>
    <property name="initialPoolSize" value="${initialPoolSize}" /></property name>
    <property name="minPoolSize" value="${minPoolSize}"></property name>
    <property name="maxPoolSize" value="${maxPoolSize}"></property name>
    <property name="acquireIncrement" value="${acquireIncrement}"></property name>
    <property name="maxStatements" value="${maxStatements}"></property name>
    <property name="acquireRetryAttempts" value="${acquireRetryAttempts}"></property name>
    <property name="acquireRetryDelay" value="${acquireRetryDelay}"> </property name>
    <property name="breakAfterAcquireFailure" 
     value="${breakAfterAcquireFailure}"></property name>
    <property name="maxIdleTime" value="${maxIdleTime}"> </property name>

, а следующий файл свойств:

    hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
    hibernate.show_sql=true
    hibernate.format_sql=true
    hibernate.cache.use_second_level_cache=true
    hibernate.cache.use_query_cache=true
    hibernate.generate_statistics=true
    cache.provider_class=org.hibernate.cache.EhCacheProvider
    initialPoolSize=5
    minPoolSize=100
    maxPoolSize=250
    acquireIncrement=5
    maxStatements=100
    acquireRetryAttempts=10
    acquireRetryDelay=1000 
    breakAfterAcquireFailure=false
    maxIdleTime=1800

Фабрика сеанса имеет автоматическую проводку и простой кодс открытой и закрытой сессией написано.

    public class BasicAunthenticationImpl {
    private static SessionFactory   sessionFactory;
    public static SessionFactory getSessionFactory()
    {
    return sessionFactory;
    }

   public static void setSessionFactory(SessionFactory sessionFactory)
   {
    BasicAunthenticationImpl.sessionFactory = sessionFactory;
   }
   }

   public class Module1 
   {
   @Autowired
   private SessionFactory   sessionFactory;
   private Session          session     = null;

   @Override
   public void process(List<RoutableModuleData> routableProcessObjects) 
   throws OndotException
   {
    try
    {
        session = sessionFactory.openSession();
        session.flush();
            canonicalMessage = 
       lookupprocesser.processInput(canonicalMessage, 
       Constants.L1_LOOKUP_CACHE, session);
    }
    catch (Exception Ex)
    {
    }
    finally
    {
        if (session != null && session.isOpen()){
            session.close();
        }
    }
    }
    }

    public class Lookupprocesser{
     public CanonicalMessage processInput(CanonicalMessage canonicalMessage, 
     String cacheLookup, Session session) throws DataInsightsCommonException
      {
         lookupSearchForL1(canonicalMessage, session, cacheLookup);
          return canonicalMessage;
       }
    }

     public class Query{

      public List<TerminalData> searchByMatchKey1AndMatchKey2(Session 
      session, String matchKey1, String matchKey2) throws 
      DataInsightsCommonException
         {
         Query query;
         List<Data> t = null;
           query = session.createQuery("from Data as odt where odt.Key1 is 
           null and odt.Key2 = :Key2");
           query.setParameter(Constants.KEY2, Key2);
           query.setCacheable(true);
          terminals = (List<Data>) query.list();
             return (null != t && !t.isEmpty()) ? t : null;
      }
     }

Объект Session является общим для всех классов и объектов, я редактировал приведенный ниже код, класс BasicAuth создает SessionFactory. Module1 будет вызывать LookupProcessor и вызывать класс запроса.Мы закрываем сессию на Module1.

...