我可以从 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 参数的默认值?
Android 无法直接连接 Postgres 数据库,也无法使用 JDBC 连接