【问题标题】:How to construct a DB DataSource using parameterized custom driver class?如何使用参数化自定义驱动程序类构造 DB DataSource?
【发布时间】:2020-10-09 23:34:47
【问题描述】:

在 Spring Boot 应用程序中,我连接到 Postgres 数据库。对于特定要求,我需要使用参数化的 DriverClass,它是 org.postgresql.Driver 的子类。

如何使用参数化的 driverClass 构造 DataSource 对象?

DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("com.apps.CustomPostgresqlDriver") // Not sure how to pass a string argument to its constructor
.build()

客户驱动程序com.apps.CustomPostgresqlDriver是这样定义的。

Public class CustomPostgresqlDriver implements Driver {

   public void CustomPostgresqlDriver(String appParam){

      ....
   }
...

}

我没有看到使用上述单参数构造函数实例化(或让 Spring 实例化)驱动程序的任何选项。示例:

new CustomPostgresqlDriver("my-app-db-param")

【问题讨论】:

  • 方法错误。您可以通过“连接属性”将属性传递给驱动程序,这些属性作为 JDBC URL 的一部分给出。
  • 嗨@Andreas,感谢您的回复。我在 qts 中添加了更多说明。您对建议的方法有任何 ex/ref 吗?
  • 您的意思是类似于 PostgreSQL JDBC driver documentation 显示可以添加到 URL 的属性?
  • 没有。如果我们只提到dataSourceBuilder.driverClassName("com.apps.CustomPostgresqlDriver"),那么spring 将实例化一个CustomPostgresqlDriver 对象。正确的 ?我想将一个字符串参数传递给类(CustomPostgresqlDriver)的构造函数。我相信应该有某种方法来处理这种结构,或者让spring绕过字符串参数进行实例化(我猜是Spring使用反射)。
  • 为什么它绝对必须是构造函数?为什么不能是Driverconnect() 方法?您知道,该方法接收 JDBC URL 和具有所有不错属性的 Properties 对象。您知道,您可以在驱动程序类名称旁边 指定属性。停止如此专注于构造函数。那是XY problem

标签: java spring postgresql spring-boot spring-data-jpa


【解决方案1】:

您可以使用 DataSourceBuilder 完成此任务: 第一个在 application.yml 中配置两个不同的 ds 设置,如下所示:

spring:
  datasource:
    main: 
      driver-class-name: ${ds.driver}
      url: ${ds.url}
      username: ${ds.username}
      password: ${ds.password}
      hikari:
        maximum-pool-size: ${ds.maximum.pool.size}
        minimum-idle: ${ds.minimum.idle}
        connection-timeout: 10000
        connection-test-query: SELECT 1
    read:
      driver-class-name: ${ds.driver}
      url: ${ds.read.url}
      username: ${ds.read.username}
      password: ${ds.read.password}
      hikari:
        maximum-pool-size: ${ds.read.maximum.pool.size}
        minimum-idle: ${ds.read.minimum.idle}
        connection-timeout: 10000
        connection-test-query: SELECT 1

第二个用 DataSourceBuilder 注入它们,如下所示:


import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;

    @Primary
    @Bean
    @ConfigurationProperties("spring.datasource.main")
    public DataSource main() {
        return DataSourceBuilder.create().build();
    }
 
 
    @Bean
    @ConfigurationProperties("spring.datasource.read")
    public DataSource read() {
        return DataSourceBuilder.create().build();
    }

【讨论】:

  • 感谢您的回复。在这种情况下,我没有创建两个数据源。我需要将一个参数传递给我的自定义数据库驱动程序的构造函数,即。 com.apps.CustomPostgresqlDriver。用对此的高级定义更新了 qts。
  • 如果你扩展 DataSourceBuilder,你就会意识到你想要什么。请看它的源代码。驱动程序将作为参数传递给您的新 DataSourceBuilder。
  • 我的示例只是展示了如何通过 yaml 传递驱动程序。如果你喜欢程序,也许它是扩展 DataSourceBuilder 的好方法。
猜你喜欢
  • 2011-09-21
  • 1970-01-01
  • 2017-03-14
  • 2016-09-22
  • 2019-11-01
  • 1970-01-01
  • 2015-09-25
  • 2023-03-11
  • 2013-04-05
相关资源
最近更新 更多