为什么 hikari.data-source-properties 中的占位符设置不正确
Why is the placeholder not set properly in hikari.data-source-properties
我正在用占位符设置 hikari.data-source-properties
,但占位符值没有被替换。它是一个基于 spring-boot 2.1.4.RELEASE 的应用程序。我的目的是设置会话属性,以便 DBA 可以识别我的应用程序。当前,当我从 DB
运行 SELECT PROGRAM FROM V$SESSION
时,我的连接得到默认的 JDBC Thin Client
下面是我 application.yml
文件中的内容
spring:
datasource:
url: "jdbc:oracle:thin:@machine:1521:service_name"
driver-class-name: "oracle.jdbc.driver.OracleDriver"
hikari.data-source-properties:
v$session.program:${spring.application.name}
下面是我 bootstrap.yml
文件中的内容
spring:
application:
name: ms-db-service
当我查询 Oracle 数据库时,我注意到程序的值字面上是 ${spring.application.name}
,而不是预期值 ms-db-service
我试过下面的方法,逻辑结果相同:
- 尝试在
application.yml
中再次重新定义 spring.application.name
- 尝试使用不同的本地定义密钥
${name}
- 添加了以下 bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
- 尝试这样指定 属性:
spring.datasource.hikari.data-source-properties: v$session.program=${spring.application.name}
我尝试了以下项目以了解更多情况:
- 我尝试为
spring.datasource.url
使用占位符并且效果很好
- 我尝试使用以下代码手动读取值,结果显示了正确的值:
@Value("${spring.datasource.hikari.data-source-properties}") String propVal;
我的结论是 HikariCp 在占位符替换完成之前读取这些值。我不明白 spring-boot bean 生命周期
中替换和数据源 bean 创建发生的相对时间
我试图避免对 hikaricp 数据源使用 bean
(不确定这是否能解决问题),因为我不想手动构建整个数据源,因为 hikari 支持大量属性。
那么,如何使用占位符在 application.yml 中设置 spring.datasource.hikari.data-source-properties
。而且,还有其他方法可以分配 spring.application.name
来识别我当前的数据库连接吗?
你必须这样使用它:
spring:
datasource:
hikari:
data-source-properties:
"[v$session.program]": ${spring.application.name}
我正在用占位符设置 hikari.data-source-properties
,但占位符值没有被替换。它是一个基于 spring-boot 2.1.4.RELEASE 的应用程序。我的目的是设置会话属性,以便 DBA 可以识别我的应用程序。当前,当我从 DB
SELECT PROGRAM FROM V$SESSION
时,我的连接得到默认的 JDBC Thin Client
下面是我 application.yml
文件中的内容
spring:
datasource:
url: "jdbc:oracle:thin:@machine:1521:service_name"
driver-class-name: "oracle.jdbc.driver.OracleDriver"
hikari.data-source-properties:
v$session.program:${spring.application.name}
下面是我 bootstrap.yml
文件中的内容
spring:
application:
name: ms-db-service
当我查询 Oracle 数据库时,我注意到程序的值字面上是 ${spring.application.name}
,而不是预期值 ms-db-service
我试过下面的方法,逻辑结果相同:
- 尝试在
application.yml
中再次重新定义 - 尝试使用不同的本地定义密钥
${name}
- 添加了以下 bean
spring.application.name
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
- 尝试这样指定 属性:
spring.datasource.hikari.data-source-properties: v$session.program=${spring.application.name}
我尝试了以下项目以了解更多情况:
- 我尝试为
spring.datasource.url
使用占位符并且效果很好 - 我尝试使用以下代码手动读取值,结果显示了正确的值:
@Value("${spring.datasource.hikari.data-source-properties}") String propVal;
我的结论是 HikariCp 在占位符替换完成之前读取这些值。我不明白 spring-boot bean 生命周期
中替换和数据源 bean 创建发生的相对时间我试图避免对 hikaricp 数据源使用 bean
(不确定这是否能解决问题),因为我不想手动构建整个数据源,因为 hikari 支持大量属性。
那么,如何使用占位符在 application.yml 中设置 spring.datasource.hikari.data-source-properties
。而且,还有其他方法可以分配 spring.application.name
来识别我当前的数据库连接吗?
你必须这样使用它:
spring:
datasource:
hikari:
data-source-properties:
"[v$session.program]": ${spring.application.name}