我们正在使用pgpool以主从模式运行2个postgresql服务器并进行负载平衡。
有时候(它不一致,其他时候工作正常),我在应用程序日志中看到了这个异常 -
09-10-17 01:35:01:627 - {ERROR} util.JDBCExceptionReporter 螺纹[HTTPS的JSSE-NIO-8443-EXEC-3];错误:无法在只读事务中执行UPDATE
这是对app服务器调用的write psql函数的调用。没有看到围绕其他写声明的任何问题,只有这个。
不知道是不是pgpool问题。
答案 0 :(得分:4)
原因是当在主从模式下启用负载平衡时,Pgpool将写入查询发送到MASTER数据库并对读取的查询进行负载平衡。更具体地,诸如DELETE,INSERT,UPDATE之类的语句被路由到Master,而SELECT获得负载平衡。现在问题是,当SELECT语句使用写入函数时,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语句中进行修改,这使得它不是一个非常可行的选择。
答案 1 :(得分:0)
我找到原因,这是为了更新数据库的psql函数,这些函数应该包含在pgpool配置的black_function_list中。
答案 2 :(得分:0)
将写入函数名称列表添加到pgpool配置中的black_function_list参数。