当前位置: 首页 > 知识库问答 >
问题:

将Spring Boot与EBean和HikariCP连接池集成

孟沛
2023-03-14

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

EBean提供了一个Spring Boot工件http://ebean-orm.github.io/docs/setup/spring#spring-boothttps://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 DataSource与Spring Boot和EBean。

我们怎么做?

共有2个答案

孟鹏海
2023-03-14

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

1.应用。性质

# 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;
}

}

埃宾

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

}

党宇定
2023-03-14

您可以在此处查看一个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是如何配置的,以及数据源是如何连接到其中的-

 类似资料:
  • 我正在使用hikaricp(这可能也适用于任何其他数据库连接池)。我有一个DBPool类,在其中我实例化了一个HikariDataSource(使用HikariConfig对象)。对于这个DBPool,我使用lazyholder习惯用法来限制每个VM一个池实例。但是,一旦获得对池的引用,就可以检索连接对象(无需任何进一步的锁/同步/信号量检查),因为我认为连接池会处理我的连接对象限制。每次通过数据

  • 我正在开发一个查询多个数据库的监控插件。我想使用HikariCP来保持连接打开,但我不知道如何实例化连接池。 HikariCP是否只使用一个池来存储多个数据库?或者一个数据库只有一个池,我的责任是实例化我将使用的数据库中的尽可能多的池。

  • 地狱, 我是否可以获取HKARIP连接池度量信息,如总连接数、空闲连接数等? 我知道Hikaripool记录这样的信息: 清理前池统计数据库(总计=20,使用次数=0,可用次数=20,等待次数=0) 但是它太频繁了,我的代码无法控制它。我想在可配置的时间内记录这些信息,例如1分钟。顺便说一句,我用Scala Slick 3.0

  • 我有这个使用HikariCP连接池的代码: 我通过发出命令“Show Processlist”来监控mysql中的连接,我看到在行之后创建了100个连接: 。。。正在运行。我肯定这不是命中注定的,对吧?它应该在稍后执行pooledDataSource时创建连接。getConnection()。 我做错了什么?为什么它会立即创建100个连接??

  • 我正在尝试将我的应用程序与JMS队列集成(使用ActiveMQ)。我使用Spring集成作为集成组件。我们希望有连池。已将'maxContopt消费者'作为100提供给'DefaultMessageListenerContainer'。 问题是,一旦从队列中读取了所有消息,“消费者数量”仍为100(如ActiveMq控制台上所示)。当我们在数据库中使用连接池(通过JNDI)时,一旦不再需要连接,它

  • 此刻我被困住的一点是调试处于“活动”状态的连接,以及它们正在做什么或它们当前被困的原因。 当我运行“10个同时用户”时,它基本上可以转换成2或3倍于此的查询,因此,当我打开HikariCP调试日志时,它会挂在类似的位置-上,而“active”连接并没有真正释放连接,这正是我试图找出的原因,因为查询相当简单,表本身只有4个字段(包括主键)。 HikariCP人员的最佳实践通常也是,增加连接池不是实现