在PostgreSQL的JDBC驱动程序连接字符串中指定work_mem等参数

我觉得做这样事情的人不太常见,但由于工作需要,我把调查结果用作备忘录。另外,关于PostgreSQL的JDBC连接字符串可以指定的选项,我找不到太多的文章。

大多数人在使用Java连接PostgreSQL时,认为连接字符串应该这样写。

jdbc:postgresql://host:port/dbname

我最近才知道可以对这个进行参数指定。

jdbc:postgresql://host:port/dbname?param1=value1&param2=value2&...

比如,如果要指定应用程序的名称,请按照以下方式指定。

jdbc:postgresql://host:port/dbname?ApplicationName=hogehoge

如果指定这个选项,执行SELECT * FROM pg_stat_activity;的话,application_name列会显示为hogehoge。
对于连接到多个系统的数据库非常方便。
(看起来好像有很多人在做这个)

所以,正题。
你可以用连接字符串来指定work_mem等参数。

jdbc:postgresql://host:port/dbname?ApplicationName=hogehoge&options=-c work_mem=1GB

如果您需要进一步指定多个选项,可以按照以下方式进行写作。

jdbc:postgresql://host:port/dbname?ApplicationName=hogehoge&options=-c work_mem=1GB -c enable_nestloop=off

顺便提一下,这次需要在Java 1.6中运行,我确认了它可以从postgresql-42.2.6.jre6.jar运行。
但是,奇怪的是,postgresql-42.2.15.jre6.jar却报错了。这是怎么回事呢…?
(也许是因为它是在使用旧版本JDBC驱动的系统中指定options时无法实现的)
有时间的话,我也想调查一下Java 1.6以外的选项。

如果有多个系统连接到同一个PostgreSQL,可以在某个系统中设置不同的work_mem,或者按照需要更改特定的配置,以控制查询计划。这样的场景下可以使用。

请参考

广告
将在 10 秒后关闭
bannerAds