我们尝试在并行模式下使用pgpool 3.2.1在多个服务器之间拆分数据库表。但是,在使用java时,它似乎只进行复制模式而不是并行模式。
在测试中,我们使用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和预处理语句的类似问题: Java queries against PGPool II cause "unnamed prepared statement does not exist" errors
但是将protocolVersion = 2添加到JDBC URL会导致java中的insert语句无法完成。
有没有人遇到过这个问题?有可能的解决方法吗?
由于
答案 0 :(得分:1)
我有同样的问题。我正在尝试使用libpq C库而不是JDBC驱动程序解决它。
我通过SWIG / JNI用Java编写了一个C库包装器,现在看起来工作正常。
您可以在this post of my blog中查看我的实验结果。
我不知道同样的解决方案是否适用于您的情况。我有很少(和隔离)表要分区,所以我将在这些特定情况下使用licpq包装器。对于应用程序的其他部分,我将继续使用JDBC驱动程序,直接连接到单个PostgreSQL后端(而不是通过PGPool)。