繁体   English   中英

Spring Boot:打开数据库连接时设置PostgreSQL运行时参数

[英]Spring Boot: setting a PostgreSQL run-time parameter when database connection is open

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

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

  1. Jdbc拦截器

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

    我不认为此拦截器提供了在连接打开时执行语句的可靠方法。 对于设置仅应设置一次的参数而言,不必拦截此拦截器提供的每个语句。

  2. initSQL属性

    Apache的池连接具有内置功能,可以通过PoolProperties.initSQL参数提供的语句来初始化自身。 这是在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数据源被Hikari取代,该Hikari支持spring.datasource.hikari.connection-init-sql属性。 它的文档说, 获取将在创建新连接时将在所有新连接上执行的SQL字符串,然后再将其添加到池中。

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

  3. ConnectionPreparer和AOP

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

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

例如,如果你想存储或与预定义的时间标记读取日期时间做到这一点,正确的方法是设置属性hibernate.jdbc.time_zone处于休眠entityManagerspring.jpa.properties.hibernate.jdbc.time_zoneapplication.properties

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM