我的 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 属性并覆盖上面定义的属性。请建议如何做到这一点。
不要扩展 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,则不需要使