【问题标题】:Pgpool master-slave replication with load balancing - prepared statement "S_380" does not exist具有负载平衡的 Pgpool 主从复制 - 准备好的语句“S_380”不存在
【发布时间】:2017-10-09 07:22:50
【问题描述】:
我们正在使用 pgpool 以主从模式运行 2 个 postgresql 服务器,并具有负载平衡。
有时(不一致,其他时候工作正常),我在应用程序日志中看到此异常 -
09-10-17 01:35:01:627 - {ERROR} util.JDBCExceptionReporter
线程[https-jsse-nio-8443-exec-3];错误:无法在只读事务中执行更新
这是对应用服务器调用的 write psql 函数的调用。没有看到其他 write 语句有任何问题,只有这个。
不知道是不是pgpool的问题。
【问题讨论】:
标签:
postgresql
jpa
database-replication
master-slave
pgpool
【解决方案1】:
您需要告诉 Pgpool-II SELECT 语句中写入函数的使用。
原因是在主从模式下启用负载均衡时,Pgpool 将写查询发送到 MASTER 数据库,并对读查询进行负载均衡。更具体地说,诸如 DELETE、INSERT、UPDATE 之类的语句被路由到 Master,而 SELECT 得到负载平衡。现在的问题是,当 SELECT 语句使用 write 函数时,Pgpool 仍然认为该语句是只读的并对其进行负载平衡。因为它没有函数定义的可见性。
所以简而言之,Pgpool-II 需要知道 SELECT 语句中可以写入数据库的函数的用法,以确保这样的 SELECT 不应该是负载平衡的。
为此,您有两种选择。
使用 Pgpool 的 black_function_list 或 whitle_function_list
配置。
http://www.pgpool.net/docs/latest/en/html/runtime-config-load-balancing.html
对包含 write 的查询使用 /*NO LOAD BALANCE*/ 前缀
功能。
/*NO LOAD BALANCE*/ SELECT my_writing_function();
但后者需要修改现有应用程序的 SQL 语句,这使得它不是一个非常可行的选择。
【解决方案2】:
我找到了原因,这是一个更新数据库的 psql 函数,这些函数应该包含在 pgpool 配置中的 black_function_list 中。
【解决方案3】:
在 pgpool 配置中的 black_function_list 参数中添加写函数名列表。