并行模式下的Pgpool在java中不起作用

时间:2013-01-24 17:15:43

标签: jdbc pgpool

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

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

由于

1 个答案:

答案 0 :(得分:1)

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

我通过SWIG / JNI用Java编写了一个C库包装器,现在看起来工作正常。

您可以在this post of my blog中查看我的实验结果。

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