You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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类型的元数据,用于识别字段类型属性,默认未启用缓存时会每次查询都触发这类元数据请求。通过以下配置可解决:

  1. 开启Postgres驱动的元数据缓存
    在JDBC连接URL中添加缓存参数,让驱动缓存类型元数据:

    jdbc:postgresql://<host>:<port>/<dbname>?cacheMetadata=true&typeCacheSize=1000
    
    • cacheMetadata=true:启用元数据缓存
    • typeCacheSize=1000:设置类型缓存容量,可按需调整
  2. 配置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})
    
  3. 优化HikariCP预编译语句缓存
    配置HikariCP缓存预编译语句,减少重复解析查询的次数,间接降低元数据查询触发频率:

    hikari.prepStmtCacheSize=250
    hikari.prepStmtCacheSqlLimit=2048
    
    • prepStmtCacheSize:预编译语句缓存数量
    • prepStmtCacheSqlLimit:缓存SQL语句的最大长度

完成以上配置后,驱动和框架会缓存JSONb类型的元数据,后续执行相关查询时不会再频繁触发这些额外的系统查询。


内容的提问来源于stack exchange,提问作者Ivan Grishaev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:20:18