java - Spring Boot:打开数据库连接时设置 PostgreSQL 运行时参数
问题描述
我正在寻找在打开数据库连接时设置运行时参数的正确方法。我的运行时参数实际上是一个时区,但我认为这应该适用于任意参数。
我找到了以下解决方案,但我觉得这些都不是正确的。
Jdbc拦截器
因为 Spring Boot 默认有 Apache Tomcat 连接池,所以我可以使用它
org.apache.tomcat.jdbc.pool.JdbcInterceptor
来拦截连接。我不认为这个拦截器提供了一种在连接打开时执行语句的可靠方法。拦截此拦截器提供的每个语句的可能性对于设置应该只设置一次的参数是不必要的。
initSQL 属性
PoolProperties.initSQL
Apache 的池连接具有通过参数提供的语句来初始化自身的内置能力。这是在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 应用程序不再有效,因为:
默认 Tomcat 数据源被支持
spring.datasource.hikari.connection-init-sql
属性的 Hikari 取代。它的文档说获取将在所有新连接创建时执行的 SQL 字符串,然后再将它们添加到池中。似乎为 Tomcat 数据源重新引入了类似的属性,如
spring.datasource.tomcat.init-s-q-l
.
连接准备器和 AOP
这不是一个实际的解决方案。它更像是一种灵感。连接准备器是用于在Spring Data JDBC Extensions项目中初始化 Oracle 连接的机制。这个东西有它自己的问题,不再维护,但可能可以用作类似解决方案的基础。
解决方案
如果你的参数实际上是一个时区,你为什么不找到一种方法来设置这个属性。
例如,如果您想存储或读取具有预定义时间戳的 DateTime,那么正确的方法是hibernate.jdbc.time_zone
在 hibernateentityManager
或spring.jpa.properties.hibernate.jdbc.time_zone
inapplication.properties
推荐阅读
- python - 通过 Python 中的函数设置对象属性
- c# - c# visual studio Windows Forms App 隐藏并重新打开表单后维护更改
- postgresql - 在 Postgres 10 中快速生成 100 GB 的 Postgres 关系
- python - Python CGI 给了我无法单独修复的错误
- reactjs - React-bootstrap:如何将初始值从状态放入输入表单
- css - CSS精灵动画反向白色闪光
- amazon-web-services - AWS Elastic Beanstalk 和外部 RDS
- python - 有效避免计算中的大型中间数组?
- javascript - HighCharts Bullet Chart 显示目标的数据标签
- mysql - Ubuntu 上的 Docker MySQL 连接问题