Spring JDBC connection pool best practices

后端 未结 4 1660
盖世英雄少女心
盖世英雄少女心 2020-11-29 23:15

I have a basic Spring JDBC application with a pretty basic configuration:



        
4条回答
  •  眼角桃花
    2020-11-29 23:26

    Definately you can use C3P0, this is developed for enterprise solution. To Check advantages you can follow this answer.

    Here is the example code of integration:

    @Bean
        public JpaTransactionManager transactionManager() {
            JpaTransactionManager transactionManager =
                    new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
            return transactionManager;
        }
    

    This Bean is for getting JpaTransactionManager.

    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
        entityManagerFactoryBean.setPackagesToScan("YOUR.DATABSE.ENTITY.PACKAGE");
        entityManagerFactoryBean.setJpaProperties(hibProperties());
    
        return entityManagerFactoryBean;
    }
    

    This Bean is for getting LocalContainerEntityManagerFactoryBean. It Takes DataSource ,PersistenceProviderClass , Entity Package Name PackagesToScan and JpaProperties from hibProperties().

    @Bean
        public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
            return new PersistenceExceptionTranslationPostProcessor();
        }
    
    private Properties hibProperties() {
            Properties properties = new Properties();
            properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
            properties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
            properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
            return properties;
        }
    

    Here, env value are comming from application.properties.

    Check bellow properties:

    hibernate.dialect: org.hibernate.dialect.Oracle12cDialect
    hibernate.show_sql: false
    hibernate.hbm2ddl.auto: none
    

    The main part is DataSource Setup. That is given bellow:

    @Bean
        public ComboPooledDataSource dataSource(){
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
    
            try {
                dataSource.setDriverClass(env.getProperty("db.driver"));
                dataSource.setJdbcUrl(env.getProperty("db.url"));
                dataSource.setUser(env.getProperty("db.username"));
                dataSource.setPassword(env.getProperty("db.password"));
                dataSource.setMinPoolSize(Integer.parseInt(env.getProperty("minPoolSize")));
                dataSource.setMaxPoolSize(Integer.parseInt(env.getProperty("maxPoolSize")));
                dataSource.setMaxIdleTime(Integer.parseInt(env.getProperty("maxIdleTime")));
                dataSource.setMaxStatements(Integer.parseInt(env.getProperty("maxStatements")));
                dataSource.setMaxStatementsPerConnection(Integer.parseInt(env.getProperty("maxStatementsPerConnection")));
                dataSource.setMaxIdleTimeExcessConnections(10000);
    
            } catch (PropertyVetoException e) {
                e.printStackTrace();
            }
            return dataSource;
        }
    

    It is using ComboPooledDataSource that is taking many more important parameter's like maxPoolSize,MinPoolSize, MaxIdleSize etc. It's environment parameter are given bellow:

    db.driver: oracle.jdbc.driver.OracleDriver // for Oracle
    db.username: YOUR_USER_NAME
    db.password: YOUR_USER_PASSWORD
    db.url: DATABASE_URL
    minPoolSize:5 // number of minimum poolSize
    maxPoolSize:100 // number of maximum poolSize
    maxIdleTime:5 // In seconds. After that time it will realease the unused connection.
    maxStatements:1000
    maxStatementsPerConnection:100
    maxIdleTimeExcessConnections:10000
    

    Here is the full working sample code:

    import com.mchange.v2.c3p0.ComboPooledDataSource;
    import org.hibernate.jpa.HibernatePersistenceProvider;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.*;
    import org.springframework.core.env.Environment;
    import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    import org.springframework.orm.jpa.JpaTransactionManager;
    import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    import javax.sql.DataSource;
    import java.beans.PropertyVetoException;
    import java.util.Properties;
    
    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories
    @PropertySource("classpath:application.properties")
    @Scope("singleton")
    public class TestDataSource {
    
        @Autowired
        private Environment env;
    
        @Qualifier("dataSource")
        @Autowired
        private DataSource dataSource;
    
        @Bean
        public JpaTransactionManager transactionManager() {
            JpaTransactionManager transactionManager =
                    new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
            return transactionManager;
        }
    
        @Primary
        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    
            LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
            entityManagerFactoryBean.setDataSource(dataSource());
            entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
            entityManagerFactoryBean.setPackagesToScan("YOUR.PACKAGE.NAME");
            entityManagerFactoryBean.setJpaProperties(hibProperties());
    
            return entityManagerFactoryBean;
        }
    
        @Bean
        public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
            return new PersistenceExceptionTranslationPostProcessor();
        }
    
        @Bean
        public ComboPooledDataSource dataSource(){
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
    
            try {
                dataSource.setDriverClass(env.getProperty("db.driver"));
                dataSource.setJdbcUrl(env.getProperty("db.url"));
                dataSource.setUser(env.getProperty("db.username"));
                dataSource.setPassword(env.getProperty("db.password"));
                dataSource.setMinPoolSize(Integer.parseInt(env.getProperty("minPoolSize")));
                dataSource.setMaxPoolSize(Integer.parseInt(env.getProperty("maxPoolSize")));
                dataSource.setMaxIdleTime(Integer.parseInt(env.getProperty("maxIdleTime")));
                dataSource.setMaxStatements(Integer.parseInt(env.getProperty("maxStatements")));
                dataSource.setMaxStatementsPerConnection(Integer.parseInt(env.getProperty("maxStatementsPerConnection")));
                dataSource.setMaxIdleTimeExcessConnections(10000);
    
            } catch (PropertyVetoException e) {
                e.printStackTrace();
            }
            return dataSource;
        }
    
        private Properties hibProperties() {
            Properties properties = new Properties();
            properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
            properties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
            properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
            return properties;
        }
    }
    

    Another things. Here is the gradle link

    compile group: 'org.hibernate', name: 'hibernate-c3p0', version: '5.2.10.Final'
    

    Hope this will help you. Thanks :)

提交回复
热议问题