具有负载平衡的Pgpool主从复制 - 准备好的语句“S_380”不存在

时间:2017-10-09 07:22:51

标签: postgresql jpa database-replication master-slave pgpool

我们正在使用pgpool以主从模式运行2个postgresql服务器并进行负载平衡。

有时候(它不一致,其他时候工作正常),我在应用程序日志中看到了这个异常 -

  

09-10-17 01:35:01:627 - {ERROR} util.JDBCExceptionReporter   螺纹[HTTPS的JSSE-NIO-8443-EXEC-3];错误:无法在只读事务中执行UPDATE

这是对app服务器调用的write psql函数的调用。没有看到围绕其他写声明的任何问题,只有这个。

不知道是不是pgpool问题。

3 个答案:

答案 0 :(得分:4)

您需要告诉Pgpool-II有关SELECT语句中写函数的用法。

原因是当在主从模式下启用负载平衡时,Pgpool将写入查询发送到MASTER数据库并对读取的查询进行负载平衡。更具体地,诸如DELETE,INSERT,UPDATE之类的语句被路由到Master,而SELECT获得负载平衡。现在问题是,当SELECT语句使用写入函数时,Pgpool仍将该语句视为只读并对其进行负载平衡。由于它没有功能定义的可见性。 所以简而言之,Pgpool-II需要知道SELECT语句中函数的用法,这些函数可以写入数据库以确保不应该对这些SELECT进行负载平衡。

为此你有两个选择。

  1. 使用Pgpool的black_function_list或whitle_function_list 配置。 http://www.pgpool.net/docs/latest/en/html/runtime-config-load-balancing.html

  2. 对包含write的查询使用/*NO LOAD BALANCE*/前缀 功能

  3. /*NO LOAD BALANCE*/ SELECT my_writing_function();
    

    但是后者需要在现有应用程序的SQL语句中进行修改,这使得它不是一个非常可行的选择。

答案 1 :(得分:0)

我找到原因,这是为了更新数据库的psql函数,这些函数应该包含在pgpool配置的black_function_list中。

答案 2 :(得分:0)

将写入函数名称列表添加到pgpool配置中的black_function_list参数。