首页 > 解决方案 > Spring Boot:打开数据库连接时设置 PostgreSQL 运行时参数

问题描述

我正在寻找在打开数据库连接时设置运行时参数的正确方法。我的运行时参数实际上是一个时区,但我认为这应该适用于任意参数。

我找到了以下解决方案,但我觉得这些都不是正确的

  1. Jdbc拦截器

    因为 Spring Boot 默认有 Apache Tomcat 连接池,所以我可以使用它org.apache.tomcat.jdbc.pool.JdbcInterceptor来拦截连接。

    我不认为这个拦截器提供了一种在连接打开时执行语句的可靠方法。拦截此拦截器提供的每个语句的可能性对于设置应该只设置一次的参数是不必要的。

  2. initSQL 属性

    PoolProperties.initSQLApache 的池连接具有通过参数提供的语句来初始化自身的内置能力。这是在ConnectionPool.createConnection(...)方法中执行的。

    不幸的是,该参数的官方支持已从 Spring中删除,并且此后没有引入等效功能。

    我的意思是,我仍然可以使用下面示例中的数据源构建器,然后将属性破解到连接池中,但这不是一个好看的解决方案。

    // Thank's to property binders used while creating custom datasource,
    // the datasource.initSQL parameter will be passed to an underlying connection pool.
    @Bean
    @ConfigurationProperties(prefix = "datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
    

    更新

    我在 Spring Boot 1.x 应用程序中对此进行了测试。以上语句对 Spring Boot 2 应用程序不再有效,因为:

    1. 默认 Tomcat 数据源被支持spring.datasource.hikari.connection-init-sql属性的 Hikari 取代。它的文档说获取将在所有新连接创建时执行的 SQL 字符串,然后再将它们添加到池中。

    2. 似乎为 Tomcat 数据源重新引入了类似的属性,如spring.datasource.tomcat.init-s-q-l.

  3. 连接准备器和 AOP

    这不是一个实际的解决方案。它更像是一种灵感。连接准备器是用于在Spring Data JDBC Extensions项目中初始化 Oracle 连接的机制。这个东西有它自己的问题,不再维护,但可能可以用作类似解决方案的基础。

标签: javapostgresqlspring-data

解决方案


如果你的参数实际上是一个时区,你为什么不找到一种方法来设置这个属性。

例如,如果您想存储或读取具有预定义时间戳的 DateTime,那么正确的方法是hibernate.jdbc.time_zone在 hibernateentityManagerspring.jpa.properties.hibernate.jdbc.time_zoneinapplication.properties


推荐阅读