我们正在尝试以并行模式使用 pgpool 3.2.1 在多个服务器上拆分数据库表。但是在使用java的时候,好像只做replication模式,没有parallel模式。
在测试中,我们使用了 3 台运行 Postgres 8.3 的后端服务器和一个测试数据库,其中要分发的表中有 300 行。
当我们使用 sql 语句(即从 psql shell)创建和查询数据库时,一切似乎都运行良好。查询系统服务器显示300行,查询3台后端服务器显示各有100行。
但是,从 java 应用程序创建相同的数据库会导致插入被复制而不是分布式,因此每个后端服务器都有全部 300 行。在java中查询系统服务器正确显示300行,但是在psql中查询系统服务器合并结果显示900行。
似乎在 java 中忽略了并行模式,而是使用复制模式。pgpool 日志中似乎没有打印任何关于此的内容,并且我在 java 中没有收到任何错误,只是数据未在后端服务器之间分发。
我发现 pgpool 手册中列出了以下限制:http: //pgpool.projects.pgfoundry.org/pgpool-II/doc/pgpool-en.html#restriction
扩展查询协议(用于并行模式)
不支持 JDBC 驱动等使用的扩展查询协议。必须使用简单查询协议。这意味着您不能使用准备好的语句。
java 程序确实使用了准备好的语句,并且不使用准备好的语句可能不是一个选项。
关于 pgpool 和prepared statements 有一个类似的问题: Java queries against PGPool II cause "unnamed Prepared statement does not exist" 错误
但是将 protocolVersion=2 添加到 JDBC URL 会导致 java 中的 insert 语句无法完成。
有没有人遇到过这个问题?有没有可能的解决方法?
谢谢