【问题标题】:Integrate Spring Boot with EBean and HikariCP Connection Pool将 Spring Boot 与 EBean 和 HikariCP 连接池集成
【发布时间】:2016-11-24 13:39:58
【问题描述】:

EBean 是一个无状态的 ORM。 http://ebean-orm.github.io/

EBean 提供了一个 Spring Boot 工件。 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

我想通过 Spring Boot 和 EBean 来利用我现有的 HikariCP 数据源。

我们如何做到这一点?

【问题讨论】:

  • 像往常一样手动配置即可。
  • 我不明白如何将 HikariCP 与 EBean 集成。我是新手。因此问题。

标签: java spring spring-boot ebean hikaricp


【解决方案1】:

您可以在此处查看有效的 EBean + Spring Boot 示例:

https://github.com/bwajtr/java-persistence-frameworks-comparison

在该存储库中,这里有 SpringBoot 配置:https://github.com/bwajtr/java-persistence-frameworks-comparison/blob/master/src/main/java/com/clevergang/dbtests/DbTestsApplication.java

在该类中,您可以看到 EBean 是如何配置的以及如何将 DataSource 连接到其中 -> 事实上,您可以使用任何实现 DataSource 接口的东西,包括 HikariCP...所以使用 DbTestsApplication 中的 EBean 配置并为 SpringBoot 设置 HikariCP (在这里查看如何操作:How do I configure HikariCP in my Spring Boot app in my application.properties files?

【讨论】:

    【解决方案2】:

    我正在这样做,现在可以正常工作了。

    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. 光配置

      @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. 豆豆

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

      }

    【讨论】:

    • 你能不能再描述一下?你为什么选择这些动作之类的