使用 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
  1. 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;
    }
    

    }

  2. 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());
        }
    }
    

    }