2

我们正在尝试以并行模式使用 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 语句无法完成。

有没有人遇到过这个问题?有没有可能的解决方法?

谢谢

4

1 回答 1

1

我也有同样的问题。我正在尝试使用 libpq C 库而不是 JDBC 驱动程序来解决它。

我通过 SWIG/JNI 用 Ja​​va 制作了 C 库的包装器,现在它似乎工作正常。

你可以在我博客的这篇文章中看到我的实验结果。

我不知道相同的解决方案是否适用于您的情况。我只有很少(并且是孤立的)表要分区,所以我将在这些特定情况下使用 licpq 包装器。对于应用程序的其他部分,我将继续使用 JDBC 驱动程序,直接连接到单个 PostgreSQL 后端(而不是通过 PGPool)。

于 2013-02-04T17:34:03.200 回答