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

Spring Boot Hikari属性以编程方式重写

岳嘉石
2023-03-14

我的 Spring 启动应用程序中有两个数据源,因此我无法使用标准数据源。其中之一的定义如下:

vertica:
  datasource:
    jdbc-url: jdbc:vertica://${DR_HOST}:${DR_PORT}/${DR_DB_NAME}
    username: ${DR_USER}
    password: ${DR_PASSWORD}
    driver-class-name: com.vertica.jdbc.Driver
    hikari:
      connectionTimeout: 30000
      idleTimeout: 10000
      maxLifetime: 10000
      keepaliveTime: 5000
      maximumPoolSize: 20
      minimumIdle: 5
      #poolName: vertica-db-pool
      #username: ${DB_USER}
      #password: ${DB_PASSWORD}
  jpa:
    hibernate:
      ddl-auto: none
      format_sql: true
      show-sql: true
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
    properties:
      hibernate:
        dialect: org.hibernate.dialect.VerticaDialect
@Configuration
@ConfigurationProperties("vertica.datasource")
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "verticaEntityManagerFactory",
        transactionManagerRef = "verticaTransactionManager",
        basePackages = { "com.yyy.vertica" }
)
public class MyDataSourceConfig extends HikariConfig {
    public final static String PERSISTENCE_UNIT_NAME = "vertica";
    public final static String PACKAGES_TO_SCAN = "com.xxx.entity";

    @Autowired
    private Environment env;

    @Bean
    public HikariDataSource verticaDataSource() {
        return new HikariDataSource(this);
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean verticaEntityManagerFactory(
            final HikariDataSource verticaDataSource) {

        return new LocalContainerEntityManagerFactoryBean() {{
            setDataSource(verticaDataSource);
            setPersistenceProviderClass(HibernatePersistenceProvider.class);
            setPersistenceUnitName(PERSISTENCE_UNIT_NAME);
            setPackagesToScan(PACKAGES_TO_SCAN);

            Properties jpaProperties = new Properties();
            jpaProperties.put("hibernate.ddl-auto", env.getProperty("vertica.jpa.hibernate.ddl-auto"));
            jpaProperties.put("hibernate.show-sql", env.getProperty("vertica.jpa.hibernate.show-sql"));
            jpaProperties.put("hibernate.format_sql", env.getProperty("vertica.jpa.hibernate.format_sql"));
            jpaProperties.put("hibernate.dialect", env.getProperty("vertica.jpa.properties.hibernate.dialect"));

            setJpaProperties(jpaProperties);

            afterPropertiesSet();;
        }};
    }

    @Bean
    public PlatformTransactionManager verticaTransactionManager(EntityManagerFactory verticaEntityManagerFactory) {
        return new JpaTransactionManager(verticaEntityManagerFactory);
    }

上面yaml文件中定义的Hikari属性没有被考虑在内(可能是由于扩展了HikariConfig)。要求是使用默认的 Hikari 属性并覆盖上面定义的属性。请建议如何做到这一点。

共有1个答案

云令
2023-03-14

不要扩展 HikariConfig

使用HikariConfig()的默认构造函数获取Hikari的默认配置属性,然后根据您的属性文件覆盖您需要的内容,就像您已经为jpa属性所做的那样。

@Bean
public HikariDataSource verticaDataSource() {
 HikariConfig hikariConfig = new HikariConfig();
        
hikariConfig.setConnectionTimeout(env.getProperty("vertica.datasource.hikari.connectionTimeout", Long.class)); 
  
hikariConfig.setIdleTimeout(env.getProperty("vertica.datasource.hikari.idleTimeout", Long.class)); 

hikariConfig.setMaxLifetime(env.getProperty("vertica.datasource.hikari.maxLifetime", Long.class)); 

hikariConfig.setKeepaliveTime(env.getProperty("vertica.datasource.hikari.keepaliveTime", Long.class));

hikariConfig.setMaximumPoolSize​(env.getProperty("vertica.datasource.hikari.maximumPoolSize", Integer.class));

hikariConfig.setMinimumIdle​(env.getProperty("vertica.datasource.hikari.minimumIdle", Integer.class));

return new HikariDataSource(hikariConfig);

}
 类似资料:
  • 所以我需要为@Transactional注释设置timeout参数。这个属性将来自一个属性文件,我不能这样做,因为我遇到了“注释属性transactional.timeout的值必须是常量表达式”。像这样的东西

  • 问题内容: 如何确保从hibernate.cfg.xml加载所有属性,然后以编程方式添加其他属性?我看到了以下代码片段,但它看起来像是全新的配置,而不是现有配置的补充。 问题答案: 您显示的代码段是您所需要的。只需使用您现有的配置,而不是创建一个新的配置即可。 如果不是您实例化配置(例如,spring),则需要扩展创建它的类。

  • 如果文件在类路径上,这就是我加载application.properties的方式。 我们正在尝试部署应用程序,其中属性文件存储在外部的Google Cloud bucket(GCS)上。我可以从GCS加载属性文件并将其保存在内存中。如何将属性传递给应用程序上下文并重写从类路径加载的属性?

  • 问题内容: 假设我有一个python对象和一个字符串,如何将属性设置为?所以: 魔术是什么?顺便说一下,这样做的目的是将对的调用缓存。 问题答案: 寻求帮助: 编辑:但是,你应注意(如注释中所指出),你不能对的“纯”实例执行此操作。但是很可能你有一个简单的对象子类,可以很好地工作。我强烈敦促不要创建这样的对象实例。

  • 问题内容: 我们使用下面的代码从属性文件中注入具有属性的Spring bean。 有没有一种方法可以通过编程方式访问属性?我试图做一些没有依赖注入的代码。所以我只想要一些这样的代码: 问题答案: 怎么样?

  • 问题内容: 我正在使用NewtonSoft JObject解析JSON字符串。如何以编程方式从动态对象获取值?我想简化代码,以免对每个对象重复说明。 有什么办法可以将“ if”语句中的代码块提取到单独的方法中,例如: 甚至有可能因为我们不能对动态对象使用反射。还是我甚至正确使用了JObject? 谢谢。 问题答案: 假设您正在使用Newtonsoft.Json.Linq.JObject,则不需要使