C3P0 создает двойное число соединений, указанных в MinPoolSize - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь использовать C3P0 для обработки пула соединений. Это мой класс конфигурации

package com.pack.webstore.config;

import javax.sql.DataSource;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.mchange.v2.c3p0.ComboPooledDataSource;

@Configuration
@ComponentScan("com.pack.webstore")
@PropertySource(value= {"classpath:database.properties", "classpath:hibernate.properties", "classpath:c3p0.properties"})
@EnableTransactionManagement
public class RootApplicationContextConfig {

    private Logger logger = Logger.getLogger(RootApplicationContextConfig.class);

    @Autowired
    private Environment environment;    

    @Bean
    public LocalSessionFactoryBean getSessionFactory() {      
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();         
        sessionFactory.setDataSource(getDataSource());
        sessionFactory.setPackagesToScan("com.pack.webstore.domain");   
        return sessionFactory;    
    }

    @Bean
    public HibernateTransactionManager getTransactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(getSessionFactory().getObject());
        return transactionManager;
    }   

    @Bean
    public DataSource getDataSource() {
        ComboPooledDataSource сomboPooledDataSource = new ComboPooledDataSource();
        try {
             сomboPooledDataSource.setDriverClass(environment.getProperty("spring.datasource.database-driver"));
        }
        catch(Exception e) {

        }       
        сomboPooledDataSource.setJdbcUrl(environment.getProperty("spring.datasource.url"));
        сomboPooledDataSource.setUser(environment.getProperty("spring.datasource.username"));
        сomboPooledDataSource.setPassword(environment.getProperty("spring.datasource.password"));
        сomboPooledDataSource.setMinPoolSize(Integer.parseInt(environment.getProperty("hibernate.c3p0.min_size")));
        сomboPooledDataSource.setMaxPoolSize(Integer.parseInt(environment.getProperty("hibernate.c3p0.max_size")));
        сomboPooledDataSource.setAcquireIncrement(Integer.parseInt(environment.getProperty("hibernate.c3p0.acquire_increment")));
        сomboPooledDataSource.setMaxStatements(Integer.parseInt(environment.getProperty("hibernate.c3p0.max_statements")));
        сomboPooledDataSource.setTestConnectionOnCheckin(Boolean.parseBoolean(environment.getProperty("hibernate.c3p0.test_connection_on_checkin")));
        сomboPooledDataSource.setIdleConnectionTestPeriod(Integer.parseInt(environment.getProperty("hibernate.c3p0.idle_connection_test_period")));
        сomboPooledDataSource.setMaxIdleTimeExcessConnections(Integer.parseInt(environment.getProperty("hibernate.c3p0.max_idle_time_excess_connections")));
        return сomboPooledDataSource;
    }

}

Это мой файл c3p0.properties

#C3P0 properties
hibernate.c3p0.min_size=11
hibernate.c3p0.max_size=20
hibernate.c3p0.acquire_increment=1
hibernate.c3p0.max_statements=30
hibernate.c3p0.test_connection_on_checkin=true
hibernate.c3p0.idle_connection_test_period=300
hibernate.c3p0.max_idle_time_excess_connections=240

Когда я пытаюсь просмотреть список соединений с базой данных MySQL (используя MySQLWorkbench), я вижу, что всегда есть double соединений, установленных методом setMinPoolSize(), даже если это число превышает MaxPoolSize значение устанавливается методом setMaxPoolSize().

Как это возможно? Что-то не так в моем коде?

...