我可以从 JDBC 连接为 Postgres 设置会话变量吗

Posted

技术标签:

【中文标题】我可以从 JDBC 连接为 Postgres 设置会话变量吗【英文标题】:Can I set session variables for Postgres from the JDBC Connection 【发布时间】:2019-11-26 22:44:51 【问题描述】:

出于性能原因,我试图限制对数据库的往返次数。目前我连接并发布了一系列语句,如SET TIMEZONE='America/New_York' 到 postgres。许多数据库允许将会话变量和类似设置作为 jdbc url 的一部分(即jdbc:postgresql://localhost:5435/test?timezone=America/New_York)传递给数据库,或者像这样将其添加到属性列表中......

String url = "jdbc:postgresql://localhost/test:5435";
Properties props = new Properties();
props.setProperty("user","fred");
props.setProperty("password","secret");
props.setProperty("timezone","America/New_York");
Connection conn = DriverManager.getConnection(url, props);

如果 postgres 支持并且测试失败,我无法找到确切的信息。

【问题讨论】:

"一系列语句,如" - 如果您使用; 分隔它们,您可以在一次往返中发送所有这些查询。尽管 JDBC 规范不允许使用单个 execute() 调用运行多个语句,但 Postgres JDBC 驱动程序确实支持这一点,例如stmt.execute("set timezone='...'; set work_mem='64MB'; set ...;") 【参考方案1】:

The documentation 说:

连接参数

[...]

选项 = 字符串

指定'options'连接初始化参数。

此属性的值可能包含空格或其他特殊字符,如果在连接 URL 中提供,则应正确编码。空格被视为分隔命令行参数,除非使用反斜杠 (\) 转义; \\ 代表文字反斜杠。

所以你应该使用

props.setProperty("options", "-c timezone=America/New_York");

【讨论】:

从文档中不清楚什么是有效的。但是当我尝试它时,我得到PSQLException: FATAL: invalid command-line argument for server process: timezone=UTC 将选项设置为-c timezone=America/New_York 不会出错,但实际上不会为会话做任何事情。 抱歉,我不知道您也需要-c。也许该值稍后会被覆盖?在 PostgreSQL 服务器上记录 SQL 语句并查看。

以上是关于我可以从 JDBC 连接为 Postgres 设置会话变量吗的主要内容,如果未能解决你的问题,请参考以下文章

通过 JDBC 连接到 postgres 服务器时 sslmode 参数的默认值?

如何使用 JDBC 接收器连接器将表名转换为大写

如何为 ClickHouse jdbc 连接设置会话时区?

Android 无法直接连接 Postgres 数据库,也无法使用 JDBC 连接

Postgres JDBC连接作为应用程序用户而不是系统用户

Kafka JDBC Sink 连接器与 PostgreSQL 12 兼容吗?