使用 EBean 和 HikariCP 连接池集成 Spring 引导
Integrate Spring Boot with EBean and HikariCP Connection Pool
EBean 是一个无状态的 ORM。
http://ebean-orm.github.io/
EBean 提供了一个 Spring 引导工件。
http://ebean-orm.github.io/docs/setup/spring#spring-boot
https://github.com/ebean-orm/avaje-ebeanorm-spring
但在那种情况下,EBean 会直接读取 jdbc 连接详细信息,如下所示。
ebean.db.ddl.generate=true
ebean.db.ddl.run=true
datasource.db.username=sa
datasource.db.password=
datasource.db.databaseUrl=jdbc:h2:mem:tests
datasource.db.databaseDriver=org.h2.Driver
我想利用现有的 HikariCP 数据源与 Spring Boot 和 EBean。
我们该怎么做?
您可以在此处检查工作的 EBean + Spring 引导示例:
https://github.com/bwajtr/java-persistence-frameworks-comparison
在该存储库中有 Spring此处的引导配置:https://github.com/bwajtr/java-persistence-frameworks-comparison/blob/master/src/main/java/com/clevergang/dbtests/DbTestsApplication.java
在那里 class 你可以看到 EBean 是如何配置的以及 DataSource 是如何连接到它的 -> 事实上你可以使用任何实现 DataSource 接口的东西,包括 HikariCP ...所以使用来自的 EBean 配置DbTestsApplication 并为 SpringBoot 设置 HikariCP(在此处查看操作方法:How do I configure HikariCP in my Spring Boot app in my application.properties files?)
我正在这样做,现在可以正常运行了。
1.application.properties
# hikariCP
spring.datasource.type=com.zaxxer.HikariDataSource
spring.datasource.driver-class-name=@datasource.db.databaseDriver@
spring.datasource.url=@datasource.db.databaseUrl@
spring.datasource.username=@datasource.db.username@
spring.datasource.password=@datasource.db.password@
spring.datasource.poolName=SpringBootHikariCP
spring.datasource.maximumPoolSize=60
spring.datasource.minimumIdle=3
spring.datasource.maxLifetime=2000000
spring.datasource.connectionTimeout=30000
spring.datasource.idleTimeout=30000
spring.datasource.pool-prepared-statements=true
spring.datasource.max-open-prepared-statements=250
Hikari 配置
@Configuration
@Component
class DataSourceConfig {
@Value("${spring.datasource.username}")
private String user;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.url}")
private String dataSourceUrl;
@Value("${spring.datasource.poolName}")
private String poolName;
@Value("${spring.datasource.connectionTimeout}")
private int connectionTimeout;
@Value("${spring.datasource.maxLifetime}")
private int maxLifetime;
@Value("${spring.datasource.maximumPoolSize}")
private int maximumPoolSize;
@Value("${spring.datasource.minimumIdle}")
private int minimumIdle;
@Value("${spring.datasource.idleTimeout}")
private int idleTimeout;
public DataSource primaryDataSource() {
HikariConfig config = new HikariConfig();
config.setPoolName(poolName);
config.setJdbcUrl(dataSourceUrl);
config.setUsername(user);
config.setPassword(password);
config.setConnectionTimeout(connectionTimeout);
config.setMinimumIdle(minimumIdle);
config.setIdleTimeout(idleTimeout);
config.setMaximumPoolSize(maximumPoolSize);
config.setMaxLifetime(idleTimeout);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
HikariDataSource ds = new HikariDataSource(config);
return ds;
}
}
ebean
@Component
public class EbeanFactoryBean implements FactoryBean<EbeanServer>, EnvironmentAware {
@Autowired
CurrentUserProv currentUser;
@Autowired
DataSourceConfig dataSourceConfig;
/**
* Properties used to configure EbeanServer instance
* (loaded from spring boot application properties).
*/
Properties properties = new Properties();
public EbeanFactoryBean() {
}
@Override
public EbeanServer getObject() throws Exception {
ServerConfig config = new ServerConfig();
config.setName("db");
config.setCurrentUserProvider(currentUser);
config.setDataSource(dataSourceConfig.primaryDataSource());
config.setDefaultServer(true);
config.setRegister(true);
return EbeanServerFactory.create(config);
}
@Override
public Class<?> getObjectType() {
return EbeanServer.class;
}
@Override
public boolean isSingleton() {
return true;
}
@Override
public void setEnvironment(Environment environment) {
loadProperties((AbstractEnvironment) environment);
}
/**
* Load into Properties (from Spring PropertySource implementations).
*/
private void loadProperties(AbstractEnvironment environment) {
MutablePropertySources propertySources = environment.getPropertySources();
// reverse the order of the property sources
List<MapPropertySource> props = new ArrayList<>();
for (PropertySource propertySource : propertySources) {
if (propertySource instanceof MapPropertySource) {
props.add(0, (MapPropertySource) propertySource);
}
}
// merge them into the single Properties
for (MapPropertySource propertySource : props) {
properties.putAll(propertySource.getSource());
}
}
}
EBean 是一个无状态的 ORM。 http://ebean-orm.github.io/
EBean 提供了一个 Spring 引导工件。 http://ebean-orm.github.io/docs/setup/spring#spring-boot https://github.com/ebean-orm/avaje-ebeanorm-spring
但在那种情况下,EBean 会直接读取 jdbc 连接详细信息,如下所示。
ebean.db.ddl.generate=true
ebean.db.ddl.run=true
datasource.db.username=sa
datasource.db.password=
datasource.db.databaseUrl=jdbc:h2:mem:tests
datasource.db.databaseDriver=org.h2.Driver
我想利用现有的 HikariCP 数据源与 Spring Boot 和 EBean。
我们该怎么做?
您可以在此处检查工作的 EBean + Spring 引导示例:
https://github.com/bwajtr/java-persistence-frameworks-comparison
在该存储库中有 Spring此处的引导配置:https://github.com/bwajtr/java-persistence-frameworks-comparison/blob/master/src/main/java/com/clevergang/dbtests/DbTestsApplication.java
在那里 class 你可以看到 EBean 是如何配置的以及 DataSource 是如何连接到它的 -> 事实上你可以使用任何实现 DataSource 接口的东西,包括 HikariCP ...所以使用来自的 EBean 配置DbTestsApplication 并为 SpringBoot 设置 HikariCP(在此处查看操作方法:How do I configure HikariCP in my Spring Boot app in my application.properties files?)
我正在这样做,现在可以正常运行了。
1.application.properties
# hikariCP
spring.datasource.type=com.zaxxer.HikariDataSource
spring.datasource.driver-class-name=@datasource.db.databaseDriver@
spring.datasource.url=@datasource.db.databaseUrl@
spring.datasource.username=@datasource.db.username@
spring.datasource.password=@datasource.db.password@
spring.datasource.poolName=SpringBootHikariCP
spring.datasource.maximumPoolSize=60
spring.datasource.minimumIdle=3
spring.datasource.maxLifetime=2000000
spring.datasource.connectionTimeout=30000
spring.datasource.idleTimeout=30000
spring.datasource.pool-prepared-statements=true
spring.datasource.max-open-prepared-statements=250
Hikari 配置
@Configuration @Component class DataSourceConfig { @Value("${spring.datasource.username}") private String user; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.url}") private String dataSourceUrl; @Value("${spring.datasource.poolName}") private String poolName; @Value("${spring.datasource.connectionTimeout}") private int connectionTimeout; @Value("${spring.datasource.maxLifetime}") private int maxLifetime; @Value("${spring.datasource.maximumPoolSize}") private int maximumPoolSize; @Value("${spring.datasource.minimumIdle}") private int minimumIdle; @Value("${spring.datasource.idleTimeout}") private int idleTimeout; public DataSource primaryDataSource() { HikariConfig config = new HikariConfig(); config.setPoolName(poolName); config.setJdbcUrl(dataSourceUrl); config.setUsername(user); config.setPassword(password); config.setConnectionTimeout(connectionTimeout); config.setMinimumIdle(minimumIdle); config.setIdleTimeout(idleTimeout); config.setMaximumPoolSize(maximumPoolSize); config.setMaxLifetime(idleTimeout); config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); HikariDataSource ds = new HikariDataSource(config); return ds; }
}
ebean
@Component public class EbeanFactoryBean implements FactoryBean<EbeanServer>, EnvironmentAware { @Autowired CurrentUserProv currentUser; @Autowired DataSourceConfig dataSourceConfig; /** * Properties used to configure EbeanServer instance * (loaded from spring boot application properties). */ Properties properties = new Properties(); public EbeanFactoryBean() { } @Override public EbeanServer getObject() throws Exception { ServerConfig config = new ServerConfig(); config.setName("db"); config.setCurrentUserProvider(currentUser); config.setDataSource(dataSourceConfig.primaryDataSource()); config.setDefaultServer(true); config.setRegister(true); return EbeanServerFactory.create(config); } @Override public Class<?> getObjectType() { return EbeanServer.class; } @Override public boolean isSingleton() { return true; } @Override public void setEnvironment(Environment environment) { loadProperties((AbstractEnvironment) environment); } /** * Load into Properties (from Spring PropertySource implementations). */ private void loadProperties(AbstractEnvironment environment) { MutablePropertySources propertySources = environment.getPropertySources(); // reverse the order of the property sources List<MapPropertySource> props = new ArrayList<>(); for (PropertySource propertySource : propertySources) { if (propertySource instanceof MapPropertySource) { props.add(0, (MapPropertySource) propertySource); } } // merge them into the single Properties for (MapPropertySource propertySource : props) { properties.putAll(propertySource.getSource()); } }
}