使用Next.JDBC+Postgres驱动时,如何避免JSONb操作重复查询pg_catalog.pg_type?
问题描述
使用Next.JDBC、官方Postgres驱动及HikariCP连接池时,每次执行涉及JSONb的查询,控制台都会输出以下额外查询:
SELECT n.nspname = ANY(current_schemas(true)), n.nspname, t.typname FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid WHERE t.oid = $1 parameters: $1 = '3802' SELECT typinput='pg_catalog.array_in'::regproc as is_array, typtype, typname, pg_type.oid FROM pg_catalog.pg_type LEFT JOIN (select ns.oid as nspoid, ns.nspname, r.r from pg_namespace as ns join ( select s.r, (current_schemas(false))[s.r] as nspname from generate_series(1, array_upper(current_schemas(false), 1)) as s(r) ) as r using ( nspname ) ) as sp ON sp.nspoid = typnamespace WHERE pg_type.oid = $1 ORDER BY sp.r, pg_type.oid DESC parameters: $1 = '3802'
这些查询的返回结果为:
-[ RECORD 1 ]-------- ?column? | t nspname | pg_catalog typname | jsonb -[ RECORD 1 ]--- is_array | f typtype | b typname | jsonb aid | 3802
请问是否可以通过调整驱动、连接池或连接设置,避免频繁出现这类查询?
解决方法
这些查询是Postgres驱动在获取JSONb类型的元数据,用于识别字段类型属性,默认未启用缓存时会每次查询都触发这类元数据请求。通过以下配置可解决:
开启Postgres驱动的元数据缓存
在JDBC连接URL中添加缓存参数,让驱动缓存类型元数据:jdbc:postgresql://<host>:<port>/<dbname>?cacheMetadata=true&typeCacheSize=1000cacheMetadata=true:启用元数据缓存typeCacheSize=1000:设置类型缓存容量,可按需调整
配置Next.JDBC启用元数据缓存
在Next.JDBC的连接配置中添加:cache-metadata true(适用于Clojure环境),让框架层面缓存类型信息:(next.jdbc/get-datasource {:dbtype "postgresql" :dbname "dbname" :host "localhost" :port 5432 :user "user" :password "pass" :cache-metadata true})优化HikariCP预编译语句缓存
配置HikariCP缓存预编译语句,减少重复解析查询的次数,间接降低元数据查询触发频率:hikari.prepStmtCacheSize=250 hikari.prepStmtCacheSqlLimit=2048prepStmtCacheSize:预编译语句缓存数量prepStmtCacheSqlLimit:缓存SQL语句的最大长度
完成以上配置后,驱动和框架会缓存JSONb类型的元数据,后续执行相关查询时不会再频繁触发这些额外的系统查询。
内容的提问来源于stack exchange,提问作者Ivan Grishaev
相关产品推荐
相关产品推荐

