Rax
Rax

Reputation: 375

Setting HikariCP connection pool properties programmatically in case of multiple datasource with spring data jpa and oracle

I am creating javax.sql.DataSource as below:

@Primary
    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSource commonDataSource() {
        String url = <url>;
        String user = <user>;
        String driverClass = "oracle.jdbc.driver.OracleDriver";
        return DataSourceBuilder.create().url(url).username(user).password(<pwd>).driverClassName(driverClass).build();
        //return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "commonEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean commonEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        Properties jpaProperties = new Properties();
        jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
        jpaProperties.put("hibernate.connection.autocommit", false);
        LocalContainerEntityManagerFactoryBean entityManagerFactory = builder.dataSource(commonDataSource())
                .packages("com.data.model.common").build();
        entityManagerFactory.setJpaProperties(jpaProperties);
        entityManagerFactory.afterPropertiesSet();
        return entityManagerFactory;
    }
    @Primary
    @Bean
    public PlatformTransactionManager commonTransactionManager(final @Qualifier("commonEntityManagerFactory") LocalContainerEntityManagerFactoryBean commonEntityManagerFactory) {
        return new JpaTransactionManager(commonEntityManagerFactory.getObject());
    }

Could someone please suggest how to set connection pool properties here. I want to use HikariCP. I am not using following properties in application.propertires

#HikariCP settings
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.minimum-idle=1

as I am creating multiple data sources. So, I want to set the connection pool related properties programmatically while instantiating the DataSource.

Upvotes: 2

Views: 4491

Answers (1)

George
George

Reputation: 116

You can do one of the options described here: https://github.com/brettwooldridge/HikariCP#initialization

Here's what we have:

@Getter
@Setter
@ToString(exclude="password")
@Configuration
@ConfigurationProperties(prefix="db")
public class RepositoryProperties {

    /**
     * Database connection string.
     */
    private String url;

    /**
     * Database username.
     */
    private String username;

    /**
     * Database password.
     */
    private String password;

    /**
     * custom properties to be set on the kikari data source
     * implemented as a map so we can add/remove any of them 
     * without changing the code
     */
    private Map<String,String> hikari;
}
    @Bean
    public DataSource getDataSource() {
        Properties properties = new Properties();
        properties.setProperty("driverClassName", DEFAULT_JDBC_DRIVER);
        properties.setProperty("jdbcUrl", repositoryProperties.getUrl());
        properties.setProperty("username", repositoryProperties.getUsername());
        properties.setProperty("password", repositoryProperties.getPassword());

        if (repositoryProperties.getHikari() != null) {
            repositoryProperties.getHikari().forEach(properties::setProperty);
        }

        HikariConfig config = new HikariConfig(properties);
        return new HikariDataSource(config);
    }
db.url=jdbc:mysql://localhost:3306/dbname
db.username=dbuname
db.password=dbpass
db.hikari.idleTimeout=30000
db.hikari.maxLifetime=30000
db.hikari.connectionTimeout=30000
db.hikari.validationTimeout=5000
db.hikari.leakDetectionThreshold=30000

Upvotes: 2

Related Questions