Skip to main content

unsupported startup parameter: statement_cache_mode

跟大家分享個小雷,如果之後未來有需要升級gorm的版本,要記得更新一下pg的連線字串 從 postgresql://user:[email protected]:6432/dev_tenant?sslmode=require&statement_cache_mode=describe 改成 postgresql://user:[email protected]:6432/dev_tenant?sslmode=require&default_query_exec_mode=cache_describe

後半段的statement_cache_mode要改成default_query_exec_mode,才有辦法正常連線,不然會出現 failed to connect to host=pg_bouncer.server user=postgres database=meta: server error (ERROR: unsupported startup parameter: statement_cache_mode (SQLSTATE 08P01)) 的錯誤訊息

會發生這個的原因是因為gorm底層依賴pgx,而他會去將原本的連線字串後面帶的參數做取代,而statement_cache_mode以及default_query_exec_mode是pgx特別規劃的參數 而這次會發生這個狀況是因為pgx將statement_cache_mode捨棄掉,改成default_query_exec_mode,然後pgx在連線的時候將statement_cache_mode直接傳給pg_bouncer而回傳的錯誤

所以如果在其他語言的driver,需要使用pg_bouncer的時候,就需要去尋找這個driver要怎麼將prepare_statement的功能關掉

另外,關於describe為什麼是用這個數值,則是因為他需要使用到pg的describe的功能 describe的意思應該就是用這個來在客戶端模擬prepared statement https://www.postgresql.org/docs/current/ecpg-sql-describe.html 因為伺服器端不支援prepared statement 所以只好跟伺服器拿一些跟這個statement相關的metadata 然後自己在客戶端處理完之後 再送給伺服器

相關連結

https://github.com/go-gorm/postgres/issues/219 https://github.com/jackc/pgx/blob/532bf8f5833ed0b37479cc75e783af388e8ee319/conn.go#L173