Skip to content

Commit 6eb6129

Browse files
committed
connection-pool feature:
add HikariCp as dataSource alongside normal dataSource
1 parent ede5346 commit 6eb6129

File tree

10 files changed

+131
-61
lines changed

10 files changed

+131
-61
lines changed

README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ This project, implement instance of basic feature, <br> you maybe want use for A
55
## basicFeature
66
- spring-web
77
- spring-jpa
8-
- with custom configuration for PersistenceContext
8+
- with custom configuration for PersistenceContext
9+
- Connection-pool
10+
- HikariCp with Possibility of customization
911
- Ehcache
1012
- customize cache config and implement log for cache
1113
- Log4j2
@@ -67,4 +69,8 @@ This project, implement instance of basic feature, <br> you maybe want use for A
6769
3 - sample test define in test directory with groovy language <br>
6870
4 - Swagger Api for show details of endpoints <br>
6971
5 - In order to change swagger url, you must be change springdoc.swagger-ui.path property in application-dev.properties <br>
70-
6 - TestContainer for run db as dockerImage, properties config exist in application-test.properties <br>
72+
6 - TestContainer for run db as dockerImage, properties config exist in application-test.properties <br>
73+
74+
### dataSource feature
75+
1 - choose between use simpleDataSource or HikariCp datasource <br>
76+
2 - you can customize properties for dataSource in application.properties

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</parent>
1111
<groupId>ir.bigz</groupId>
1212
<artifactId>springboot-real</artifactId>
13-
<version>1.2.0</version>
13+
<version>1.3.0</version>
1414
<name>basicFeaturesForSpringProject</name>
1515
<description>Demo project for use Spring Boot in project</description>
1616

src/main/java/ir/bigz/springbootreal/configuration/DataSourceConfiguration.java

Lines changed: 5 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
package ir.bigz.springbootreal.configuration;
22

3-
import com.zaxxer.hikari.HikariConfig;
4-
import com.zaxxer.hikari.HikariDataSource;
53
import org.springframework.beans.factory.annotation.Autowired;
6-
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
7-
import org.springframework.boot.context.properties.ConfigurationProperties;
8-
import org.springframework.boot.jdbc.DataSourceBuilder;
4+
import org.springframework.beans.factory.annotation.Qualifier;
95
import org.springframework.context.annotation.Bean;
106
import org.springframework.context.annotation.Configuration;
117
import org.springframework.core.env.Environment;
@@ -24,50 +20,16 @@ public class DataSourceConfiguration {
2420
@Autowired
2521
private Environment env;
2622

27-
@Bean
28-
@ConfigurationProperties(prefix = "demo.datasource")
29-
public DataSourceProperties dataSourceProperties() {
30-
return new DataSourceProperties();
31-
}
32-
33-
34-
@Bean
35-
public DataSource dataSource() {
36-
DataSourceProperties dataSourceProperties = dataSourceProperties();
37-
// final HikariDataSource dataSource = new HikariDataSource();
38-
// dataSource.setDriverClassName(dataSourceProperties.getDriverClassName());
39-
// dataSource.setJdbcUrl(dataSourceProperties.getUrl());
40-
// dataSource.setUsername(dataSourceProperties.getUsername());
41-
// dataSource.setPassword(dataSourceProperties.getPassword());
42-
// dataSource.setConnectionTimeout(Integer.parseInt(env.getProperty("spring.datasource.hikari.connectionTimeout")));
43-
// dataSource.setMaximumPoolSize(Integer.parseInt(env.getProperty("spring.datasource.hikari.maximumPoolSize")));
44-
// return dataSource;
45-
return connectionPoolDataSource(DataSourceBuilder.create()
46-
.driverClassName(dataSourceProperties.getDriverClassName())
47-
.url(dataSourceProperties.getUrl())
48-
.username(dataSourceProperties.getUsername())
49-
.password(dataSourceProperties.getPassword())
50-
.build());
51-
}
52-
53-
protected HikariConfig hikariConfig(DataSource dataSource) {
54-
HikariConfig hikariConfig = new HikariConfig();
55-
int cpuCores = Runtime.getRuntime().availableProcessors();
56-
hikariConfig.setMaximumPoolSize(cpuCores * 4);
57-
hikariConfig.setDataSource(dataSource);
58-
hikariConfig.setAutoCommit(false);
59-
return hikariConfig;
60-
}
23+
private final DataSource dataSource;
6124

62-
protected HikariDataSource connectionPoolDataSource(
63-
DataSource dataSource) {
64-
return new HikariDataSource(hikariConfig(dataSource));
25+
public DataSourceConfiguration(@Qualifier("HikariDataSourceInit") DataSource dataSource) {
26+
this.dataSource = dataSource;
6527
}
6628

6729
@Bean
6830
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
6931
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
70-
factory.setDataSource(dataSource());
32+
factory.setDataSource(dataSource);
7133
factory.setPackagesToScan(new String[]{"ir.bigz.springbootreal.dao"});
7234
factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
7335

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package ir.bigz.springbootreal.configuration;
2+
3+
import com.zaxxer.hikari.HikariConfig;
4+
import com.zaxxer.hikari.HikariDataSource;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
import org.springframework.core.env.Environment;
9+
10+
import javax.sql.DataSource;
11+
import java.util.Properties;
12+
13+
/**
14+
* {@link HikariDataSourceInit} use for build connection-pool base on HikariCp with customize properties,
15+
* and then added to {@link DataSourceConfiguration} class as datasource for use in app.
16+
*/
17+
18+
@Configuration
19+
public class HikariDataSourceInit{
20+
21+
@Autowired
22+
private Environment env;
23+
24+
@Bean(name = "HikariDataSourceInit")
25+
public DataSource dataSource(){
26+
HikariConfig hikariConfig = new HikariConfig(hikariProperties());
27+
int cpuCores = Runtime.getRuntime().availableProcessors();
28+
hikariConfig.setMaximumPoolSize(cpuCores * 4);
29+
hikariConfig.setConnectionTimeout(Long.parseLong(env.getProperty("hikari.connectionTimeout")));
30+
hikariConfig.setIdleTimeout(Long.parseLong(env.getProperty("hikari.idleTimeout")));
31+
hikariConfig.setMaxLifetime(Long.parseLong(env.getProperty("hikari.maxLifetime")));
32+
return new HikariDataSource(hikariConfig);
33+
}
34+
35+
protected Properties hikariProperties(){
36+
Properties hikariProps = new Properties();
37+
hikariProps.setProperty("dataSourceClassName", env.getProperty("hikari.dataSourceClassName"));
38+
hikariProps.setProperty("dataSource.user", env.getProperty("hikari.dataSource.user"));
39+
hikariProps.setProperty("dataSource.password", env.getProperty("hikari.dataSource.password"));
40+
hikariProps.setProperty("dataSource.databaseName", env.getProperty("hikari.dataSource.databaseName"));
41+
return hikariProps;
42+
}
43+
44+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package ir.bigz.springbootreal.configuration;
2+
3+
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
4+
import org.springframework.boot.context.properties.ConfigurationProperties;
5+
import org.springframework.boot.jdbc.DataSourceBuilder;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
import javax.sql.DataSource;
9+
10+
/**
11+
* {@link SimpleDataSourceInit} implement basicDataSource,
12+
* if you want use connection-pool use {@link HikariDataSourceInit}
13+
*/
14+
@Configuration
15+
public class SimpleDataSourceInit {
16+
17+
@Bean
18+
@ConfigurationProperties(prefix = "demo.datasource")
19+
public DataSourceProperties dataSourceProperties(){
20+
return new DataSourceProperties();
21+
}
22+
23+
// @Bean(name = "SimpleDataSourceInit")
24+
public DataSource dataSource(){
25+
DataSourceProperties dataSourceProperties = dataSourceProperties();
26+
return DataSourceBuilder.create()
27+
.driverClassName(dataSourceProperties.getDriverClassName())
28+
.url(dataSourceProperties.getUrl())
29+
.username(dataSourceProperties.getUsername())
30+
.password(dataSourceProperties.getPassword())
31+
.build();
32+
}
33+
}

src/main/resources/application-dev.properties

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
################### Server Configuration ##########################
22
server.port=9090
33

4-
################### DataSource Configuration ##########################
4+
################### Simple DataSource Configuration ##########################
55
demo.datasource.driver-class-name=org.postgresql.Driver
66
demo.datasource.url=jdbc:postgresql://localhost:5432/myapp
77
demo.datasource.username=postgres
@@ -14,9 +14,16 @@ demo.jpa.show-sql=true
1414
################### cache Configuration ##########################
1515
spring.cache.jcache.config=classpath:ehcache.xml
1616

17-
################### default connection pool ##########################
18-
spring.datasource.hikari.connectionTimeout=20000
19-
spring.datasource.hikari.maximumPoolSize=5
17+
################### Hikari DataSource Configuration ##########################
18+
hikari.dataSourceClassName=org.postgresql.ds.PGSimpleDataSource
19+
hikari.dataSource.user=postgres
20+
hikari.dataSource.password=postgres
21+
hikari.dataSource.databaseName=myapp
22+
hikari.dataSource.portNumber=5432
23+
hikari.dataSource.serverName=localhost
24+
hikari.connectionTimeout=30000
25+
hikari.idleTimeout=600000
26+
hikari.maxLifetime=1800000
2027

2128
################### condition Configuration ##########################
2229
app.generator.enabled=false

src/main/resources/application-docker.properties

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
server.port=9090
33

44

5-
################### DataSource Configuration ##########################
5+
################### Simple DataSource Configuration ##########################
66

77
demo.datasource.driver-class-name=org.postgresql.Driver
88
demo.datasource.url=jdbc:postgresql://spring-db:5432/myapp
@@ -18,10 +18,16 @@ demo.jpa.show-sql=true
1818

1919
spring.cache.jcache.config=classpath:ehcache.xml
2020

21-
################### default connection pool ##########################
22-
23-
spring.datasource.hikari.connectionTimeout=20000
24-
spring.datasource.hikari.maximumPoolSize=5
21+
################### Hikari DataSource Configuration ##########################
22+
hikari.dataSourceClassName=org.postgresql.ds.PGSimpleDataSource
23+
hikari.dataSource.user=postgres
24+
hikari.dataSource.password=postgres
25+
hikari.dataSource.databaseName=myapp
26+
hikari.dataSource.portNumber=5432
27+
hikari.dataSource.serverName=localhost
28+
hikari.connectionTimeout=30000
29+
hikari.idleTimeout=600000
30+
hikari.maxLifetime=1800000
2531

2632
################### condition Configuration ##########################
2733

src/test/groovy/ir/bigz/springbootreal/web/InitTestContainerDB.groovy

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package ir.bigz.springbootreal.web
22

33
import ir.bigz.springbootreal.configuration.DataSourceConfiguration
4-
4+
import ir.bigz.springbootreal.configuration.HikariDataSourceInit
5+
import ir.bigz.springbootreal.configuration.SimpleDataSourceInit
56
import ir.bigz.springbootreal.configuration.WebConfiguration
67
import ir.bigz.springbootreal.dal.UserRepositoryImpl
78
import ir.bigz.springbootreal.dao.User
@@ -24,7 +25,7 @@ import spock.lang.Specification
2425

2526
@Testcontainers
2627
@ContextConfiguration(classes = [UserRepositoryImpl.class, User.class,
27-
DataSourceConfiguration.class, WebConfiguration.class], initializers = InitTestContainerDB.class)
28+
DataSourceConfiguration.class, WebConfiguration.class, SimpleDataSourceInit.class, HikariDataSourceInit.class], initializers = InitTestContainerDB.class)
2829
@SpringBootTest(properties = "spring.profiles.active:test")
2930
@EnableAutoConfiguration(exclude = [DataSourceAutoConfiguration.class,
3031
HibernateJpaAutoConfiguration.class,

src/test/groovy/ir/bigz/springbootreal/web/RepositoryTest.groovy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package ir.bigz.springbootreal.web
22

33
import ir.bigz.springbootreal.configuration.DataSourceConfiguration
4+
import ir.bigz.springbootreal.configuration.HikariDataSourceInit
5+
import ir.bigz.springbootreal.configuration.SimpleDataSourceInit
46
import ir.bigz.springbootreal.configuration.WebConfiguration
57
import ir.bigz.springbootreal.dal.DaoRepository
68
import ir.bigz.springbootreal.dal.DaoRepositoryImpl
@@ -25,7 +27,7 @@ import java.sql.Timestamp
2527
import java.time.LocalDateTime
2628

2729
@ContextConfiguration(classes = [UserRepositoryImpl.class, User.class,
28-
DataSourceConfiguration.class, WebConfiguration.class, DataGenerator.class])
30+
DataSourceConfiguration.class, SimpleDataSourceInit.class, HikariDataSourceInit.class, WebConfiguration.class, DataGenerator.class])
2931
@Title("Test repository layer")
3032
@SpringBootTest(properties = "spring.profiles.active:test")
3133
@EnableAutoConfiguration(exclude = [DataSourceAutoConfiguration.class,

src/test/resources/application-test.properties

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ server.port=9090
55
demo.datasource.dockerImageName=postgres:latest
66
demo.datasource.imagePort=5432
77
demo.datasource.dbName=sp_test
8+
9+
################### Simple DataSource Configuration ##########################
810
demo.datasource.url=jdbc:tc:postgresql:latest://localhost/myapp
911
demo.datasource.username=user
1012
demo.datasource.password=password
@@ -18,9 +20,16 @@ demo.jpa.show-sql=true
1820
################### cache Configuration ##########################
1921
spring.cache.jcache.config=classpath:ehcache.xml
2022

21-
################### default connection pool ##########################
22-
spring.datasource.hikari.connectionTimeout=20000
23-
spring.datasource.hikari.maximumPoolSize=5
23+
################### Hikari DataSource Configuration ##########################
24+
hikari.dataSourceClassName=org.postgresql.ds.PGSimpleDataSource
25+
hikari.dataSource.user=user
26+
hikari.dataSource.password=password
27+
hikari.dataSource.databaseName=sp_test
28+
hikari.dataSource.portNumber=5432
29+
hikari.dataSource.serverName=localhost
30+
hikari.connectionTimeout=30000
31+
hikari.idleTimeout=600000
32+
hikari.maxLifetime=1800000
2433

2534
################### condition Configuration ##########################
2635
app.generator.enabled=false

0 commit comments

Comments
 (0)